「原创声明:保留所有权利,禁止转载」
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 为用户提供「保留所有权利,禁止转载」的选项。
除非获得原作者的单独授权,任何第三方不得转载标注了「原创声明:保留所有权利,禁止转载」的内容,否则均视为侵权。
具体请参见TesterHome 知识产权保护协议。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。