测试求道之路 python 反射.py 属性区域

陈子昂 · 2018年12月23日 · 553 次阅读

python 反射

太惨了,发这个文章的时候卡了,然后断开网页,就要重新打 很多也忘记了。
python 反射有很多种功能,今天介绍其中一种通过 getattr 让对象通过反射变成覆盖的方法,并且反射修改 其他区域的内容,具体看代码实例。【本文用于读书会】

文章前提条件

需要对 全局方法,类下面 类变量,类构造器,类实例变量,类成员方法 和平时写的代码一一对得上。
这样对于深入学习 python 和内存模型会帮助很大,否则是无法进行的。

例子 反射不同区域的

同模块下 新建 1 个 Test.py

def a(): #全局方法a()
    print("执行了函数a")

def b():
    print("执行了函数b")

def c():
    print("执行了函数c")

class TestDemo():#类
    tt = 100 #类变量

    def __init__(self,name): #类构造器
        self.name =name #类实例变量

    def run(self): #类成员方法
        a() #调用全局方法,2层看1层的 参加读书会的会比较理解,载入关系
        b()
        c()

同模块下 新建 1 个 invoke_t.py 用来演示反射

from actions import Test  #路径

#反射全局方法
if hasattr(Test,"a"): #判断有没有这个方法
   func =getattr(Test,"a")
   func()#反射执行的是Test文件下面的a方法
else:
    print("没有找到")

#反射类成员函数
if hasattr(Test,"TestDemo"):
    func_1 =getattr(Test,"TestDemo")#class 'actions.Test.TestDemo'
    func_1(name="chendamao").run() #()需要构造器,实例化对象
else:
    print("类下面没有找到函数")

#反射类变量,绕开构造器
if hasattr(Test,"TestDemo"):
    func_1 =getattr(Test,"TestDemo")#class 'actions.Test.TestDemo'
    if hasattr(func_1,"tt"):#func_1是字节码了,已经有了就可以直接setattr
        print("修改前",getattr(func_1,"tt"))
        setattr(func_1,"tt","110")#int也要是字符串
        print("修改后", getattr(func_1, "tt"))
else:
    print("类下面没有找到函数")
print("实际结果被修改为",Test.TestDemo("chendamao").tt) #这个被改变了,输出是110

#反射类构造器
t =Test.TestDemo("chendamao")
if getattr(t,"name"):
    setattr(t,"name","chenxiaomao")
    print(getattr(t,"name")) #chenxiaomao修改了构造器结果

里面包含了主要的 getattr,hasattr,setattr 的基础用法

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册