反射
一、什么是反射?? 在面向对象的思想中,把对象能够访问、查询、修改自身的状态或行为称为“反射”。 二、python中的反射 Python思想:一切事物皆为对象。 在python中,可以通过字符串的的形式来操作对象的属性。这种行为称之为python中的反射。 三、python实现反射(自省)的手段: 通过4个内置函数来实现:hasattr(object,name) getattr(object,name,default=None) setattr(x,y,v) delattr(x,y) hasattr(object,name) 复制代码 #判断object中有没有一个name字符串对应的方法或属性 存在返回True,不存在返回False class BlackMedium: feture = 'Ugly' def __init__(self,name,addr): self.name=name self.addr=addr def sell_hourse(self): print('【%s】正在买房子,'%self.name) def rent_hourse(self): print('【%s】正在组房子,'%self.name) b1=BlackMedium('W祝愿','zu') #b1.name --->b1.__dict__['name'] #找的是b1里 print(hasattr(b1,'addr')) getattr(object,name,default=None) 复制代码 class BlackMedium: feture = 'Ugly' def __init__(self,name,addr): self.name=name self.addr=addr def sell_hourse(self): print('【%s】正在买房子,'%self.name) def rent_hourse(self): print('【%s】正在组房子,'%self.name) print(getattr(b1,'name')) print(getattr(b1,'rent_hourse')) print(getattr(b1,'rent_hourdfghfse','没有这事'))#没有就报错. 加默认参数ok #找到函数地址直接加括号运行 func=getattr(b1,'rent_hourse') func() #也可以为实例增加修改内容 setattr(b1,'sb',True) setattr(b1,'sb1','gvxdvx') print(b1.__dict__) delattr(x,y) 复制代码 def delattr(x, y): # real signature unknown; restored from __doc__ """ Deletes the named attribute from the given object. delattr(x, 'y') is equivalent to ``del x.y'' """ pass delattr(b1,'sb') print(b1.__dict__) 注意:不仅仅是实例对象才能使用反射,类本身也是对象,所以类也可以用反射,即类也可以作为object参数参入到上述四个函数中去。例如: 复制代码 class Foo(object): staticField = "old boy" def __init__(self): self.name = 'wupeiqi' def func(self): return 'func' @staticmethod def bar(): return 'bar' print getattr(Foo, 'staticField') print getattr(Foo, 'func') print getattr(Foo, 'bar') 类也是对象 复制代码 再如,文件再python中也被看作是对象,所以一个文件也能用上述四种方法来操作。 复制代码 #新建一个a.py文件,该文件下定义两个变量x和y x=111 y=222 import sys obj1=sys.modules[__name__]#__name__当前程序所在的模块的名称 print(hasattr(obj1,'z')) #如果能找到名为x的属性,返回True,这里返回的是True