什么是反射
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
python面向对象中的反射:
通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
四个可以实现自省的函数
下列方法适用于类和对象(一切皆对象,类本身也是一个对象)
(1)对象中是否存在属性与方法的判断
如果第二个只是属性,则返回属性值,如果是方法名,则返回方法的内存地址,如果第二个参数没有在对象中找到,程序崩溃
classA(object):
def__init__(self,name):
self.name=name
defrun(self):
return"Hello Word SB"
#判断obj是否有第二个参数
obj=A("xxx")
#如果第二个只是属性,则返回属性值,如果是方法名,则返回方法的内存地址,如果第二个参数没有在对象中找到,程序崩溃
# res = getattr(obj, "name") # xxx,返回属性值
res=getattr(obj,"run")#方法返回内存地址,>
print(res)
(2)检查对象中是否存在方法,找到返回true,否则放回false
classA(object):
def__init__(self,name):
self.name=name
defrun(self):
return"Hello Word SB"
obj=A("xxx")
res=hasattr(obj,"run")# True
print(res)
(3)对象属性的设置
classA(object):
def__init__(self,name):
self.name=name
defrun(self):
return"Hello Word SB"
a=A("虎妞")
print(a.name)#查看之前的name属性值,虎妞
setattr(a,"name","小白")#设置修改name属性值
print(a.name)#查看修改后的属性值 ,小白
#当设置的值不存在时,会自动添加到实例对象中
setattr(a,'age',16)
print(a.age)#16
(4)删除对象属性
classA(object):
def__init__(self,name):
self.name=name
defrun(self):
return"Hello Word SB"
#删除对象属性
a=A("大牛")
delattr(a,"name")
print(a.name)#程序挂了
领取专属 10元无门槛券
私享最新 技术干货