反射就是经过字符串来操做类或者对象的属性python
经过字符串来获取,设置,删除对象中的属性或方法函数
class Foo: def __init__(self,name,pwd): self.name = name self.pwd = pwd def run(self): print('run') def speak(self): print('speak') p=Foo('xichen',18)
hasattr:判断一个方法是否存在与这个类中code
print(hasattr(p,'name'))
True对象
getattr:根据字符串去获取obj对象里的对应的方法的内存地址,加"()"括号便可执行内存
if hasattr(p,cmd): run=getattr(p,cmd) run() else: print('该命令不存在')
请输入命令:run字符串
runget
setattr:经过setattr将外部的一个函数绑定到实例中input
1.经过用户输入将外部的属性添加到当前的实例中 print(p.__dict__) key=input('请输入key:') value=input('输入value:') setattr(p,key,value) print(p.__dict__)
{'name': 'xichen', 'pwd': 18}
请输入key:age
输入value:18
{'name': 'xichen', 'pwd': 18, 'age': '18'}cmd
2.动态的将外部的方法添加到当前的实例中 def test(a): print(a) print(p.__dict__) setattr(p,'test',test) print(p.__dict__) p.test(0)
{'name': 'xichen', 'pwd': 18}
{'name': 'xichen', 'pwd': 18, 'test': <function test at 0x000001D1E98069D8>}
0it
delattr:删除一个实例或者类中的方法
1.最原始的删除对象的属性方法 print(p.__dict__) del p.name print(p.__dict__)
{'name': 'xichen', 'pwd': 18}
{'pwd': 18}
2.动态删除p中属性为变量a的属性 a=input('请输入要删除的属性:') print(p.__dict__) delattr(p,a) print(p.__dict__)
请输入要删除的属性:pwd # 删除对象中属性为pwd字符串的属性
{'name': 'xichen', 'pwd': 18}
{'name': 'xichen'}
判断一下对象中有没有没有我输入的属性,若是有,打印
cmd=input('请输入要查询的属性:') if hasattr(p,cmd): a=getattr(p,cmd) print(a) else: print('该属性不存在')
请输入要查询的属性:name xichen