Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Monkeypatching内部导入_Python_Python Decorators_Monkeypatching - Fatal编程技术网

Python Monkeypatching内部导入

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

我有3个文件(使用py2)

装饰师:

#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查看我的其他答案;我将保留此选项,以防此解决方案适合其他人的需要。