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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jonny Jiang-zh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值