我有这样的代码:
class A:
...
class B(A):
...
class C(B, A):
...
如你所见,类C来自两次,一次直接,一次间接通过类B.可以吗?这可能会发生什么错误?
可以吗?
是的。Python会将C
到[C, B, A, object]
的MRO唯一地区分出来,因此碱基A
只出现一次。这个过程在Python 2.3方法解析顺序中有描述。
这可能会发生什么错误?
有人看到你的代码可能会觉得"这太奇怪了。为什么他们在这里使用多重继承?">
在更复杂的情况下,Python也可能在创建一致的MRO时遇到麻烦,例如,如果您有class C(A, B)
而不是C(B, A)
类,这将是一个模棱两可的MRO。但是您将知道是否会发生这种情况,因为在类定义期间将出现TypeError
异常。
是的,这很好。这被称为多重继承。在其他语言中,比如c++,这会导致一个叫做"菱形问题"的问题。因为在绘制说明继承的图表时的形状。Python定义了一个方法解析顺序(MRO)来解决这个问题。我建议你阅读钻石问题和Python的MRO来更好地理解这个问题。
注意,菱形问题涉及四个类,而不是示例中的三个:class A:
...
class B(A):
...
class C(A):
...
class D(C, B):
...
- 这被称为多重继承。
- 然而,多重继承会导致一些棘手的情况,所以尽量避免这些情况。
- 通常建议在可能的情况下使用单继承,在真正需要的时候使用多继承。