我试图替换类中定义的函数,以便在不更改实际代码的情况下修改其函数(如内部工作)。 我从来没有这样做过,因此,有一些问题,而更换它。 更改代码将使我访问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
#problem here
mytest.testFunc = alternativeFunc
如您所见,如果我只是手动覆盖(?)类中具有我定义的函数的函数将无法正常工作。 它没有给出任何语法错误,但是,问题是被替换的函数认为“self”是该函数的另一个变量,并说它需要“variable”变量的另一个参数(我想这不是一个好名字)。
我想做的是使替换函数与被替换函数完全相同,但是需要额外的代码或一些小的修改。然而,“自我”在课堂上并没有发挥应有的作用。 是否有方法正确实现已定义函数以替换导入类的函数?
您可以按如下方法使用猴子贴片:
输出:
我建议4种解决方案,从最坏到最好(IMHO),但这当然也取决于您的具体限制:
替换实例方法(1):我使用函数是Python中的描述符这一事实,以便可以使用
AlternativeFunc
上的__get__
方法将其作为实例mytest
的方法获取,并覆盖实例mytest
的testFunc
方法(而不覆盖类方法):替换实例方法(2):这次,我使用的
types.MethodType
比第一个解决方案可读性更强:执行类方法的猴子修补。与第一个方法不同,它更改类的任何实例的行为:
创建从
testMOD
继承的类以重写方法:检查python中的类继承,以创建自己的自定义类:
相关问题 更多 >
编程相关推荐