我建议4种解决方案,按照我个人意见从最差到最好排序,但当然这也取决于你的具体限制:
替换实例方法(1):我利用了在Python中函数是描述符的事实,这样我就可以在AlternativeFunc
上使用__get__
方法将其作为mytest
实例的方法,并覆盖mytest
实例的testFunc
方法(而不覆盖类方法):
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)
mytest1.testFunc = alternativeFunc1.__get__(mytest1, testMOD)
mytest1.testFunc(10)
mytestX = testMOD()
mytestX.testFunc(10)
替换实例方法(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)
funcType = types.MethodType
mytest1.testFunc = funcType(alternativeFunc1, mytest1)
mytest1.testFunc(10)
mytestX = testMOD()
mytestX.testFunc(10)
执行类方法的猴子补丁。与第一种方法不同,它会更改类的任何实例的行为: 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)
testMOD.testFunc = alternativeFunc2
mytest2.testFunc(10)
mytestX = testMOD()
mytestX.testFunc(10)
创建一个继承自
testMOD
的类,覆盖该方法:
class testMODNew(testMOD):
def testFunc(self, variable):
var = variable
self.something = var + 1.2
print('Alternative3:', self.something)
mytest3 = testMODNew()
mytest3.testFunc(10)