繁体   English   中英

猴子在 Python 的另一个模块中用其他导入修补 class

[英]Monkey patching a class in another module in Python with other imports

我正在尝试修补 python 模块以覆盖 class 中的方法。这是一个用于简化的代理模块,而不是我正在覆盖的实际代码或模块,但遵循相同的结构。

该模块在内部看起来像:

dog_module.py

from ._util    import b
from ._util    import log


class Bork(BorkBase):

    def __init__(self, verbose=False, options=None):
        self.a = 42

    def define_bork(self, bark):
        result = bark
        log.info('Importing: %r', bark)
        return result

其中_util.py与此dog_module.py位于同一父文件夹中

我在源代码处修改了 package 代码(在 python/.../site-packages/ 中),这工作正常,但我想猴子修补它,以便其他人更容易部署(因此他们不必 go进入源代码并在他们的机器上自己进行这些更改)。

我尝试在我的脚本中覆盖def define_bork(): : :

import dog_module

def new_bork(self, bark, breed):
        result = bark
        log.info('Importing: %r', bark)
        if breed == "big":
          result = bark + "!"
        return result

class Dog:
    def __init__(self, color, breed):
        self.color = color
        self.breed = breed
        self.woof = self.woof()
        
    def woof(self):
        dog_module.Bork.define_bork = new_bork
        bark = dog_module.Bork()
        return bark.define_bork("woof",self.breed) # returns string "woof!"


my_dog_spot = Dog(“black”, “big”)

但问题是它似乎正确修改了原始 dog_module 中的“define_bork()”方法,但它抛出:

     61 def new_bork(self, bark, breed):
     62           result = bark
---> 63           log.info('Importing: %r', bark)
     64           if breed == "big":
     65               result = bark + "!"
     66           return result

NameError: name 'log' is not defined

除了log之外, _utils.py中还有其他方法,因此不能完全删除它。 我认为它仍然会正确地继承 class 的所有内容,并且只是覆盖一个方法,但它似乎不能那样工作。

function 将看到定义它的模块的全局变量。“全局变量”还指该模块中存在的任何其他函数、方法常量,包括从第三个模块导入的那些。

在这种情况下,您需要在覆盖脚本中定义的 function 才能访问原始模块的某些名称,如果它将替换另一个 function -

所有你需要做的,如果你可以像你在这里做的那样导入其他模块,就是引用你需要的那些名称的限定名称 - 所以,而不是log你引用你的 function 中的dog_module.log需要访问这些值。

您的代码将使用这个简单的替换:

import dog_module

def new_bork(self, bark, breed):
        result = bark
        dog_module.log.info('Importing: %r', bark)
        if breed == "big":
          result = bark + "!"
        return result

...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM