python中的“反射”

python中的反射

反射

  • 原理:在python中万物皆对象,对象中的全部的属性和方法都是经过字典形式保存的,若是咱们想得到对象中的某个属性或方法只须要:
    1. 首先得到该对象的全部属性和函数的字典
    2. 经过键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]()
相关文章
相关标签/搜索