<p>如果要将<code>methodX</code>添加到现有类中,可以考虑多重继承:</p>
<pre><code>class A:
def methodA(self):
return 5
class B:
def methodB(self):
return 10
class X():
@classmethod
def new(cls, baseclass):
if baseclass == A:
return AX()
elif baseclass == B:
return BX()
else: raise Exception("Not supported baseclass %s!" % str(baseclass))
def methodX(self):
return 42
class AX(A, X):
pass
class BX(B, X):
pass
</code></pre>
<p>您可以将arg和kwarg添加到<code>X.new</code>,并将它们传递给特定的构造函数。以下是您的测试结果(我更正了您问题的最后一个):</p>
<pre><code>>>> ax = X.new(A)
>>> ax.methodA() # returns 5
5
>>> ax.methodX() # returns 42
42
>>> ax.methodB() # methodB not defined
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: AX instance has no attribute 'methodB'
>>> bx = X.new(B)
>>> bx.methodB() # returns 10
10
>>> bx.new(B).methodX() # returns 42
42
>>> bx.new(B).methodA() # methodA not defined
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: BX instance has no attribute 'methodA'
</code></pre>