093 反射
一、什么是反射
反射就是通过字符串来操作类或者对象的属性
通过字符串来获取,设置,删除对象中的属性或方法
二、如何使用反射
- 反射本质就是在使用内置函数,其中反射有以下四个内置函数:
- hasattr:判断一个方法是否存在与这个类中
- getattr:根据字符串去获取obj对象里的对应的方法的内存地址,加"()"括号即可执行
- setattr:通过setattr将外部的一个函数绑定到实例中
- delattr:删除一个实例或者类中的方法
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:判断一个方法是否存在与这个类中
print(hasattr(p,'name'))
True
-
getattr:根据字符串去获取obj对象里的对应的方法的内存地址,加"()"括号即可执行
if hasattr(p,cmd): run=getattr(p,cmd) run() else: print('该命令不存在')
请输入命令:run
run
-
setattr:通过setattr将外部的一个函数绑定到实例中
1.通过用户输入将外部的属性添加到当前的实例中 print(p.__dict__) key=input('请输入key:') value=input('输入value:') setattr(p,key,value) print(p.__dict__)
{'name': 'xichen', 'pwd': 18}
请输入key:age
输入value:182.动态的将外部的方法添加到当前的实例中 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>}
0 -
delattr:删除一个实例或者类中的方法
1.最原始的删除对象的属性方法 print(p.__dict__) del p.name print(p.__dict__)
{'name': 'xichen', 'pwd': 18}
2.动态删除p中属性为变量a的属性 a=input('请输入要删除的属性:') print(p.__dict__) delattr(p,a) print(p.__dict__)
请输入要删除的属性:pwd # 删除对象中属性为pwd字符串的属性
三、使用反射的例子
-
判断一下对象中有没有没有我输入的属性,如果有,打印
cmd=input('请输入要查询的属性:') if hasattr(p,cmd): a=getattr(p,cmd) print(a) else: print('该属性不存在')
请输入要查询的属性:name
xichen