我有3个文件(使用py2)。
装饰者:
# decoratorfile.py
def deco(func):
return func使用装饰器的类:
# classfile.py
import decoratorfile
class Cla:
@decoratorfile.deco
def meth(self):
pass和一个使用类文件的文件:
# excecution.py
from classfile import Cla
cla = Cla()
cla.meth()我想要修改装饰器,并且我只能编辑execution.py文件。我该怎么做呢?
发布于 2019-12-16 20:42:37
只需在定义类Cla之前(但在import decoratorfile之后)匹配deco函数即可。下面的代码将您的示例压缩到一个文件中,但是如果您遵循上一句话,将它分散到多个文件中应该不会影响结果。
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发布于 2019-12-16 21:32:48
这有点麻烦,但您可以重写import decoratorfile来有效地导入打了猴子补丁的deco装饰器。
$ 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
Hihttps://stackoverflow.com/questions/59356514
复制相似问题