首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Monkeypatching内部导入

Monkeypatching内部导入
EN

Stack Overflow用户
提问于 2019-12-16 20:18:34
回答 2查看 28关注 0票数 0

我有3个文件(使用py2)。

装饰者:

代码语言:javascript
复制
# decoratorfile.py
def deco(func):
   return func

使用装饰器的类:

代码语言:javascript
复制
# classfile.py
import decoratorfile
class Cla:
    @decoratorfile.deco
    def meth(self):
        pass

和一个使用类文件的文件:

代码语言:javascript
复制
# excecution.py
from classfile import Cla
cla = Cla()
cla.meth()

我想要修改装饰器,并且我只能编辑execution.py文件。我该怎么做呢?

EN

回答 2

Stack Overflow用户

发布于 2019-12-16 20:42:37

只需在定义类Cla之前(但在import decoratorfile之后)匹配deco函数即可。下面的代码将您的示例压缩到一个文件中,但是如果您遵循上一句话,将它分散到多个文件中应该不会影响结果。

代码语言:javascript
复制
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()

输出

代码语言:javascript
复制
Hi
票数 0
EN

Stack Overflow用户

发布于 2019-12-16 21:32:48

这有点麻烦,但您可以重写import decoratorfile来有效地导入打了猴子补丁的deco装饰器。

代码语言:javascript
复制
$ 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59356514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档