「All right reserved, any unauthorized reproduction or transfer is prohibitted」
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 的基础用法
TesterHome 为用户提供「保留所有权利,禁止转载」的选项。
除非获得原作者的单独授权,任何第三方不得转载标注了「All right reserved, any unauthorized reproduction or transfer is prohibitted」的内容,否则均视为侵权。
具体请参见TesterHome 知识产权保护协议。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
No Reply at the moment.