day25_python_反射_getattr()方法_hasattr()方法_setattr()方法_delattr()方法

#Author:'haijing'
#date:2018/10/28

# 在python中反射的执行效率还是很高的 反射:通过字符串的形式去操作对象中的成员
#---------getattr(a,'b')方法 从a这个地方拿出b,其中b必须是字符串----------#
# class Foo:
# def __init__(self,name,age):
# self.name = name
# self.age = age
# def show(self):
# return '%s-%s' %(self.name,self.age) #%s为占位符
#
# obj = Foo('haijing',18)
# v1 = obj.name #name是一个变量名 以变量的形式去拿obj中name的值
# print(v1) #打印haijing
#
# v2 = getattr(obj,'name') #以字符串的形式去obj中拿name的值
# print(v2) #打印haijing
#
# func = getattr(obj,'show') #以字符串的形式去拿类中的show()方法 此时func就是show()方法
# r = func() #实际上是去执行show()函数
# print(r) #打印haijing-18

#-------hasattr(a,'b')方法 从a这个地方去检测有没有b,其中b必须是字符串 如果在a中有a则返回True-------#
#---------setattr(a,'b','c') 向对象a中添加成员 a.b = c----------#
#---------delattr(a,'b',) 删除对象a中添加成员成员b----------#
# class Foo:
# def __init__(self,name,age):
# self.name = name
# self.age = age
# def show(self):
# return '%s-%s' %(self.name,self.age) #%s为占位符
#
# obj = Foo('haijing',18)
# print(hasattr(obj,'name')) #打印True
#
# setattr(obj,'k1','v1') #设置self.k1 = v1 存储在内存中
# print(obj.k1) #打印v1
#
# delattr(obj,'name') #删除obj中的name变量
# # obj.name #此时在这一句就会报错

#---------通过类(Foo)+字符串去操作对象中的成员,Foo也是类type的对象----------#
class Foo:
stat = '123' #静态字段
def __init__(self,name,age):
self.name = name
self.age = age
#以前是这样去拿静态字段的值
obj = Foo('haijing',18)
print(obj.stat)
#现在是这样去拿静态字段的值
r = getattr(Foo,'stat') #通过字符串去操作对象中的成员,Foo也是type的对象啊
print(r)

#---------不同py文件之间的字符串去操作对象中的成员----------#

reflection02.py中的内容为:
name = 'haijing'

def func():
return 'func'

class Foo:
def __init__(self,name,age):
self.name = name
self.age = age

 #reflection01中的内容为:
# import reflection02
# r1 = getattr(reflection02,'name') #执行reflection02.py中的name='haijing'
# print(r1) #打印haijing
# r2 = getattr(reflection02,'func') #执行reflection02.py中的func()函数
# print(r2()) #打印func
# cls = getattr(reflection02,'Foo') #cls就等于reflection02.py中的Foo类
# obj = cls('haijing',18) #obj就相当于reflection02.py中的Foo类的对象
# print(obj.name)

#---------------反射的小应用--------------#

s2.py中的内容:
#Author:'haijing'
#date:2018/10/28

def f1():
return '首页'
def f2():
return '新闻'
def f3():
return '精华'
s1.py中的内容:

#以前 较麻烦
#import s2
# inp = input('请输入要查看的URL:')
# if inp == 'f1':
# s2.f1()
# elif inp == 'f2':
# s2.f2()
# elif inp == 'f3':
# s2.f3()

#现在 用反射改进
import s2
inp = input('请输入要查看的URL:')

if hasattr(s2,inp): #判断用户输入的是否在s2.py模块中有或没有,若有执行func,否则执行else
func = getattr(s2, inp) # inp本身就是字符串
result = func()
print(result)
else:
print('404')

haijing in HZ 新的一周要开始了~~
2018.10.28 晚









转载于:https://www.cnblogs.com/YiYA-blog/p/9867751.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值