[英]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.