Python 中的猴子修补

Monkey-patching in Python

我有一个模块 THIRDPARTY,其中包含各种 classes 和函数:

def multi(n1, n2):
    result = n1 * n2
    return result

class Spam():

    def original_function(self, num1, num2):
        result = multi(num1, num2)
        new_result = result + result
        print(new_result)

我导入了模块: 将第三方导入为 tp

现在,我想用以下内容替换 class 垃圾邮件中的 original_function

def original_function(self, num1, num2):
    result = multi(num1, num2) 
    new_result = num1 - num2
    print(new_result)

请注意original_function中不同的数学运算。我尝试但没有奏效的方法:

tp.Spam.originalfunction = originalfunction

但是,它不继承其他 classes 和功能(例如 def multi)。

猴子补丁运行良好。我试着用 Flask 做了,得到了结果。

import flask

def mult(self, n1, n2):
    print(n1 * n2)

flask.Flask.before_request = mult

obj = flask.Flask('name')
obj.before_request(3, 4)  # 12

我猜你还没有将 multi() 导入为 multi()。尝试 tp.multi() 而不是 multi()


这是一个例子:

# ------in module.py file------

def multi(inp1, inp2):
    return inp1 + inp2

class A():
    def func1(self):
        print(multi(3, 4))
# ------in current file------

# what you're currently doing:

import module as md

def func1(self):
        print(multi(3, 4) + 10)


md.A.func1 = func1
class1 = A()
class1.func1()  # NameError: name 'multi' is not defined
# ------in current file------

# the fix:

import module as md

def func1(self):
        print(md.multi(3, 4) + 10)


md.A.func1 = func1
class1 = A()
class1.func1()

如果这不起作用,向我们展示实际功能可能会有所帮助,因为您可能遗漏了一些关键细节。