一、什么是反射??
在面向对象的思想中,把对象能够访问、查询、修改自身的状态或行为称为“反射”。
二、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