Python:替换模块类中的函数
我试图替换在类中定义的函数,以便在不更改实际代码的情况下修改其功能(如内部工作)。我以前从未做过此事,因此在替换它时会遇到一些问题。更改代码将使我能够访问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’变量的另一个参数(我想那不是一个好名字)。
我要做的是使替换函数与被替换函数完全相同,但是要附加代码或进行一些小的修改。但是,“自我”在课堂上几乎没有发挥作用。是否有一种方法可以正确实现定义的函数来替换导入的类的函数?
-
我建议从最差到最佳(IMHO)的4种解决方案,但是当然,这也取决于您的特定限制:
-
替换实例方法(1):我使用函数是Python中的描述符这一事实,因此我可以使用
__get__
on方法AlternativeFunc
将其作为实例方法获取mytest
并覆盖实例testFunc
方法mytest
(而不会覆盖类方法) :class testMOD(object): def testFunc(self, variable): var = variable self.something = var + 12 print('Original:', self.something)
def alternativeFunc1(self, variable):
var = variable
self.something = var + 1.2
print(‘Alternative1:’, self.something)mytest1 = testMOD()
mytest1.testFunc(10) # Original: 22mytest1.testFunc = alternativeFunc1.get(mytest1, testMOD)
mytest1.testFunc(10) # Alternative1: 11.2
mytestX = testMOD()
mytestX.testFunc(10) # Original: 22 -
替换实例方法(2):这次,我使用
types.MethodType
比第一种解决方案更具可读性的方法:import types
class testMOD(object):
def testFunc(self, variable):
var = variable
self.something = var + 12
print(‘Original:’, self.something)def alternativeFunc1(self, variable):
var = variable
self.something = var + 1.2
print(‘Alternative1:’, self.something)mytest1 = testMOD()
mytest1.testFunc(10) # Original: 22funcType = types.MethodType
mytest1.testFunc = funcType(alternativeFunc1, mytest1)
mytest1.testFunc(10) # Alternative1: 11.2
mytestX = testMOD()
mytestX.testFunc(10) # Original: 22 -
对类方法执行猴子修补。与第一种方法不同,它更改了该类任何实例的行为:
class testMOD(object): def testFunc(self, variable): var = variable self.something = var + 12 print('Original:', self.something)
def alternativeFunc2(self, variable):
var = variable
self.something = var + 1.2
print(‘Alternative2:’, self.something)mytest2 = testMOD()
mytest2.testFunc(10) # Original: 22testMOD.testFunc = alternativeFunc2
mytest2.testFunc(10) # Alternative2: 11.2
mytestX = testMOD()
mytestX.testFunc(10) # Alternative2: 11.2 -
创建一个从其继承的类
testMOD
以覆盖该方法:class testMODNew(testMOD): def testFunc(self, variable): var = variable self.something = var + 1.2 print('Alternative3:', self.something)
mytest3 = testMODNew()
mytest3.testFunc(10) # Alternative3: 11.2
-