我正在尝试替换类中定义的函数,以便在不更改实际代码的情况下修改其功能(如内部工作)。我以前从未这样做过,因此在更换它时遇到了一些问题。
更改代码将使我能够访问我的 Python 库中的包,这不是一个很好的选择。
例如,如果模块名为 testMOD,
class testMOD(object):
def testFunc(self, variable):
var = variable
self.something = var + 12
然后我将导入 testMOD,定义一个类 (mytest = testMOD()),并访问类中定义的函数 testFunc,并将其更改为已定义的函数。
例如,
from somemodule import testMOD
mytest = testMOD()
def alternativeFunc(self, variable):
var = variable
self.something = var + 1.2
# A problem here
mytest.testFunc = alternativeFunc
如您所见,如果我只是用我定义的函数手动覆盖(?)类中的函数,它将无法正常工作。
它没有给出任何语法错误,但是,问题是被替换的函数认为“self”是函数的另一个变量,并说它需要“variable”变量的另一个参数(我想那不是一个好名字)。
我想让替换函数与被替换函数完全相同,但有额外的代码或一些小的修改。但是,“自我”在课堂上几乎没有发挥应有的作用。
有没有办法正确实现定义的函数来替换导入类的函数?
原文由 Cody Chung 发布,翻译遵循 CC BY-SA 4.0 许可协议
我建议 4 种解决方案,从最差到最好(恕我直言),当然这也取决于您的具体限制:
__get__
方法在AlternativeFunc
上获取它作为实例的方法mytest
并覆盖实例的testFunc
方法mytest
(不覆盖类方法):types.MethodType
比第一个解决方案更具可读性:testMOD
的类来覆盖方法: