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]()