我建议从最差到最佳(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



