簡體   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