<p>我建议4种解决方案,从最坏到最好(IMHO),但这当然也取决于您的具体限制:</p>
<ol>
<li><p>替换实例方法(1):我使用函数是Python中的描述符这一事实,以便可以使用<code>AlternativeFunc</code>上的<code>__get__</code>方法将其作为实例<code>mytest</code>的方法获取,并覆盖实例<code>mytest</code>的<code>testFunc</code>方法(而不覆盖类方法):</p>
<pre><code>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.__get__(mytest1, testMOD)
mytest1.testFunc(10) # Alternative1: 11.2
mytestX = testMOD()
mytestX.testFunc(10) # Original: 22
</code></pre></li>
<li><p>替换实例方法(2):这次,我使用的<code>types.MethodType</code>比第一个解决方案可读性更强:</p>
<pre><code>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
</code></pre></li>
<li><p>执行类方法的猴子修补。与第一个方法不同,它更改类的任何实例的行为:</p>
<pre><code>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
</code></pre></li>
<li><p>创建从<code>testMOD</code>继承的类以重写方法:</p>
<pre><code>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
</code></pre></li>
</ol>