# 反射主要是程序可以访问,监测和修改它本身状态或行为的一种能力(自省)。 # 四个可以实现自省的函数 # hasattr(object,name) 判断object中有没有一个name字符串对应的方法或者属性 #getattr(obj, attr,default = None): # 调用这个方法将返回obj中名为attr值的属性的值,例如如果attr为'bar',则返回obj.bar。 # 没有的话就返回默认值 # setattr(obj, attr, val): # 调用这个方法将给obj的名为attr的值的属性赋值为val。例如如果attr为'bar', # 则相当于obj.bar = val。 # delattr(obj,attr) #del obj.attr # 四个方法的演示 class BlackMedium: feature = "Ugly" def __init__(self,name,addr): self.name = name self.addr = addr def sell_house(self): print("%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不是傻逼" % self.name) def rent_house(self): print("%s 黑中介租房子啦,傻逼才租呢" %self.name) b1 = BlackMedium("中介","房子") # 监测是否含有某属性 # 可以是数据属性,也可以是函数属性 print(hasattr(b1,'name')) print(hasattr(b1,'sell_house')) # 获取属性 n = getattr(b1,'name') func = getattr(b1,'rent_house') print(n) func() # getattr(b1,'age') # 出错 # 要设置默认属性,这样没有的时候才不会报错 print(getattr(b1,'age','没有这个属性')) # 设置属性 setattr(b1,'gender','male') print(b1.gender) setattr(b1,'show_name',lambda self:self.name + 'sb') print(b1.__dict__) print(BlackMedium.__dict__) print(b1.show_name(b1)) # 不会自动传入参数,需手动 # 删除属性 delattr(b1,'addr') delattr(b1,'show_name') # 此时已经没有了show_name属性,所以会报错 # delattr(b1,'show_name') print(b1.__dict__) # 类也是对象 class Foo(object): staticField = 'old boy' def __init__(self): self.name = 'wang' def func(self): return 'func' @staticmethod def bar(): return 'bar' print(getattr(Foo,'staticField')) print(getattr(Foo,'func')) print(getattr(Foo,'bar')) import sys def s1(): print('s1') def s2(): print('s2') this_module = sys.modules[__name__] print(hasattr(this_module,'s1')) print(getattr(this_module,'s2')) print(this_module) # 也可以用反射来查找某个模块是否存在某个方法