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()
如果这不起作用,向我们展示实际功能可能会有所帮助,因为您可能遗漏了一些关键细节。
我有一个模块 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()
如果这不起作用,向我们展示实际功能可能会有所帮助,因为您可能遗漏了一些关键细节。