python中的反射
反射
- 原理:在python中万物皆对象,对象中的所有的属性和方法都是通过字典形式保存的,如果我们想获得对象中的某个属性或方法只需要:
- 首先获得该对象的所有属性和函数的字典
- 通过键key的索引获取相应的值
class A:
def __init_(self, name):
self.name = name
def func(self):
pass
a = A('a)
setattr(a, 'age', 10)
getattr(a, 'sex', '没有找到')
hasattr(a, 'age')
delattr(a, 'age')
# 当我们想通过一个字符串操作对象中的同名的方法时,我们就可以通过attr相关的函数操作
msg = input('please enter a method name:') # 在这里,如果我们输入 'func',然后向往常一样调用a.msg,那么就会报错说a中没有msg这个参数,而不是我们想象中的a.func,另外一种情况就是:a.'func'(),这显然也不行,因为对象中的func是一个变量,指向一块内存空间。
# 当我们应用反射技术时,就可以实现
# 形式1
if hasattr(a, msg):
getattr(a, msg)()
else:
print('not find')
# 形式2
getattr(a, msg, 'not find')
# 推荐使用形式1
def fun():
pass
def foo():
pass
# 应用, 通过反射的思想调用上面定义的函数,正常情况下直接:func()
methodName = input('please enter method name:')
# 方法1
import sys
obj = sys.__modules__['__main__]
if hasattr(obj, methodName):
getattr(obj, methodName)
else:
print('not find')
# 方法2,先通过globals()获取当前模块的所有属性和函数的字典,然后通过函数名字的索引获取相应的地址,再调用函数
globals()[methodName]()