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]()
posted @ 2020-11-03 15:57  JonnyJiang-zh  阅读(157)  评论(0编辑  收藏  举报