反射(自省):主要是指程序可以访问、检测和修改它本身状态或行为的一种能力
四个可以实现自省的函数:
1、hasattr(object,name)
object--->对象,name--->字符串
判断object中有没有一个name字符串对应的方法或属性
class AAA: def __init__(self,name,addr): self.name=name self.addr=addr def sale(self): print('----->') p1=AAA('alex','nanjing') print(hasattr(p1,'name')) #True print(hasattr(p1,'sale')) #True print(hasattr(p1,'shugl')) #False
2、getattr(object,name,default=None)
运行object对象所对应的name方法。若指定了default,不存在name时显示default内容,不指定时报错
class AAA: def __init__(self,name,addr): self.name=name self.addr=addr def sale(self): print('----->') p1=AAA('alex','nanjing') print(getattr(p1,'name')) # alex print(getattr(p1,'sale')) #返回sale函数的内存地址 func=getattr(p1,'sale') func() #-----> print(getattr(p1,'shugl','没有这个参数')) #没有这个参数 print(getattr(p1,'shugl')) #报错
3、setattr(object,name,value)
设置object对象的name属性值为value
class AAA: def __init__(self,name,addr): self.name=name self.addr=addr def sale(self): print('----->') p1=AAA('alex','nanjing') setattr(p1,'name','alex1234') print(p1.name) #alex1234 setattr(p1,'age',30) print(p1.__dict__) #{'age':'30','name':'alex','addr':'nanjing'}
4、del (object,name)
删除object对象的name属性
class AAA: def __init__(self,name,addr): self.name=name self.addr=addr def sale(self): print('----->') p1=AAA('alex','nanjing') print(p1.__dict__) #{'name':'alex','addr':'nanjing'} delattr(p1,'name') print(p1.__dict__) #{'addr':'nanjing'}