python 反射
在做程序开发过程中个,我们需要执行对象里面的某个方法,或者调用对象中的某个变量,当由于我们无法确定这个方法或变量是否存在,
这时我们就需要一个特殊的方法或机制要访问或操作这个方法或变量,这种机制就就叫做反射
hasattr(obj,name_str) 判断obj对象中是否有对应的name_str字符串的方法(其中obj为对象名,name_str为字符串)
getattr(obj,name_str) 根据字符串name_str去获得obj对象里对应的方法的内存地址
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Person(object): 2 def __init__(self,name): 3 self.name = name 4 def talk(self): 5 print("%s正在交谈"%self.name) 6 7 p = Person("laowang") 8 print(hasattr(p,"talk")) # True。因为存在talk方法 9 print(hasattr(p,"name")) # True。因为存在name变量 10 print(hasattr(p,"abc")) # False。因为不存在abc方法或变量 11 12 ---------------------
setattr(obj,'name_str',abc) 为obj对象添加abc方法或变量并命名为name_str
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def abc(self): 2 print("%s正在交谈"%self.name) 3 4 class Person(object): 5 def __init__(self,name): 6 self.name = name 7 8 p = Person("laowang") 9 setattr(p,"talk",abc) # 将abc函数添加到对象中p中,并命名为talk 10 p.talk(p) # 调用talk方法,因为这是额外添加的方法,需手动传入对象 11 12 13 setattr(p,"age",30) # 添加一个变量age,复制为30 14 print(p.age) # 打印结果:30 15 16 ---------------------
delattr(obj,'name_str') 删除obj对象中的变量name_str ,注意不能用于删除方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Person(object): 2 def __init__(self,name): 3 self.name = name 4 def talk(self): 5 print("%s正在交谈"%self.name) 6 7 p = Person("laowang") 8 9 delattr(p,"name") # 删除name变量 10 print(p.name) # 此时将报错 11 12 --------------------- 13 14 本文来自 喷跑的豆子 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/y472360651/article/details/73277957?utm_source=copy
本章博客由作者刘少辉著写