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