2019年8月9日 反射/自省
反射/自省:程序可以访问,检测和修改本身状态或行为的一种能力。
python中提供四种函数:
hasattr(obj,name) 判断obj中有没有一个name字符串对应的方法或者属性
getattr(obj,name(,default))等到obj中name的值
setattr(obj,name,value)设置obj中name的值时value
delattr(obj,name) 删除obj中的name值
class BlackMedium: feture='ugly' def __init__(self,name1,addr): self.name=name1 self.addr=addr def sell_hourse(self): print('%s正在卖房'%self.name) def rent_hourse(self): print('%s租房子'%self.name) b1=BlackMedium('zyk','sh') r=hasattr(b1,'name') print(r) s=hasattr(b1,'sell_hourse') #在查询b1能不能调用class BlackMedium中的属性 print(s) w1=getattr(b1,'name') #同b1.name w2=getattr(b1,'rent_hourse')#没有默认参数,如果没有就会报错 w3=getattr(b1,'abc','没有这个属性')#如果没有,就反馈默认参数 print(w1,w2,w3)#w2是函数地址 w2() b1.sb=True#上下两个方法都能用,设置与修改的功能 setattr(b1,'sb2',False) print(b1.__dict__) del b1.sb delattr(b1,'sb2')#删除 print(b1.__dict__)
》》》
True
True
zyk <bound method BlackMedium.rent_hourse of <__main__.BlackMedium object at 0x102097dd8>> 没有这个属性
zyk租房子
{'name': 'zyk', 'addr': 'sh', 'sb': True, 'sb2': False}
{'name': 'zyk', 'addr': 'sh'}
class BlackMedium: feture='ugly' def __init__(self,name1,addr): self.name=name1 self.addr=addr def sell_hourse(self): print('%s正在卖房'%self.name) def rent_hourse(self): print('%s租房子'%self.name) b1=BlackMedium('zyk','sh') setattr(b1,'func',lambda x:x+1)#定义类func函数,x做参数,返回x+1 print(b1.__dict__) print(b1.func(3)) setattr(b1,'func2',lambda self:self.name+'sb')#注意调用的是自己 print(b1.func2(b1))
》》》
{'name': 'zyk', 'addr': 'sh', 'func': <function <lambda> at 0x102188f28>}
4
zyksb
hello文件中 class Ftb: def __init__(self,addr): self.addr=addr print('正在上传%s'%addr) test文件中 from hello import Ftb #从hello中倒入 Ftb 类 f1=Ftb('12,12,12') if hasattr(f1,'get'): func_get=getattr(f1,'get') func_get() #f1.get() else: print('不存在get该方法') print('处理其他的逻辑') # 好处就是不必纠结get方法怎么实现的,以后有get方法了会实施 hello 文件中 #补上get函数 def get(self): print('正在上传文件') #反射的应用场景,可插拔设计。
》》》
正在上传12,12,12
正在上传文件