我建议从最差到最佳(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: 22
mytest1.testFunc = alternativeFunc1.(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: 22
funcType = 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: 22
testMOD.testFunc = alternativeFunc2 mytest2.testFunc(10) # Alternative2: 11.2 mytestX = testMOD() mytestX.testFunc(10) # Alternative2: 11.2
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