Python Monkeypatching内部导入
我有3个文件(使用py2) 装饰师:Python Monkeypatching内部导入,python,python-decorators,monkeypatching,Python,Python Decorators,Monkeypatching,我有3个文件(使用py2) 装饰师: #decoratorfile.py def deco(func): 返回函数 使用装饰器的类: #classfile.py 导入装饰文件 类别Cla: @decoratorfile.deco def冰毒(自身): 通过 以及使用类文件的文件: #execcution.py 从类文件导入Cla cla=cla() 类别meth() 我想修补装饰程序,我只能编辑execution.py文件。 如何执行此操作?在定义类Cla之前(但在您导入decorator
#decoratorfile.py
def deco(func):
返回函数
使用装饰器的类:
#classfile.py
导入装饰文件
类别Cla:
@decoratorfile.deco
def冰毒(自身):
通过
以及使用类文件的文件:
#execcution.py
从类文件导入Cla
cla=cla()
类别meth()
我想修补装饰程序,我只能编辑execution.py
文件。
如何执行此操作?在定义类
Cla
之前(但在您导入decoratorfile
之后),只需对deco
函数进行monkeypatch即可。以下内容将示例压缩为一个文件,但如果按照上一句话进行操作,则将其分散到多个文件中不会影响结果
from functools import wraps
def deco(func):
return func
def monkey_patch(func):
@wraps(func)
def with_print(*args, **kwargs):
print("Hi")
return func(*args, **kwargs)
return with_print
deco = monkey_patch # decoratorfile.deco = monkey_patch
class Cla:
@deco
def meth(self):
pass
cla = Cla()
cla.meth()
输出
Hi
有点小技巧,但您可以重写
import decoratorfile
以有效地导入经过修补的deco
decorator
$ cat monkeypatch.py
import decoratorfile
from functools import wraps
def monkey_patch(func):
@wraps(func)
def with_print(*args, **kwargs):
print("Hi")
return func(*args, **kwargs)
return with_print
decoratorfile.deco = monkey_patch
$ cat execution.py
import inspect
import classfile
import monkeypatch
classfile_source = inspect.getsource(classfile)
monkeypatch_source = inspect.getsource(monkeypatch)
exec(classfile_source.replace("import decoratorfile", monkeypatch_source))
cla = Cla()
cla.meth()
$ python3 execution.py
Hi
我忘了提到我只能编辑
execution.py
@Jochman查看我的其他答案;我将保留此选项,以防此解决方案适合其他人的需要。