4.4 クラスの多重継承
プログラミングでクラスを定義する場合、複数のクラスを継承する場合、そのクラスは と呼ばれます多重继承
。これにより、サブクラスが複数の異なる親クラスからプロパティとメソッドを継承できるようになります。たとえば、Pegasus クラスは、Mammals クラスと Birds クラスの両方を継承します。
class Animal:
def eat(self):
print('我饿了')
def sleep(self):
print('我困了')
class Mammal(Animal):
def walk(self):
print('我会走')
class Bird(Animal):
def fly(self):
print('我会飞')
class Tianma(Mammal, Bird):
...
tianma = Tianma()
tianma.eat()
tianma.sleep()
tianma.walk()
tianma.fly()
お腹が空いた
、眠い
、歩ける
、飛べる
4.4.1 MRO(相続解決命令)
Python では、MRO はメソッド解決順序の略です。これは、サブクラスが複数の親クラスを継承するときにメソッドが呼び出される順序を決定します。
Python は C3 アルゴリズムを使用して MRO を計算します。基本的なルールは、リスト内の各クラスの最初の出現順序を維持しながら、すべての親クラスを左から右に継承することです。さらに、クラスに複数のスーパークラスがある場合、Python はスーパークラスのシーケンスを結合して線形 MRO を作成しようとします。
メソッドを見つけるために、Python はメソッドが見つかるかチェーンの最後に到達するまで MRO チェーンを検索します。必要なメソッドがどのクラスにも見つからない場合は、AttributeError 例外が発生します。
以下は、super() 関数と MRO オーダーを使用して親クラスのメソッドを呼び出す方法を示すコード スニペットの例です。
class A:
def foo(self):
print("A")
class B(A):
def foo(self):
super().foo()
print("B")
class C(A):
def foo(self):
print("C")
class D(B, C):
pass
d = D()
d.foo() # 输出 A B
この例では、クラス D は 2 つのクラス B と C を継承します。その MRO 順序は [D、B、C、A] であるため、 d.foo() メソッドを呼び出すと、Python はまずクラス B の foo() メソッドを呼び出します (super() 関数が使用されているため)、次にクラス A の foo() メソッドを見つけます。
クラスの __mro__ 属性を使用して、クラスの mro リストを表示できます。
>>> print( Tianma.mro )
(<クラス 'メイン.Tianma'>、<クラス 'メイン .哺乳類'>、<クラス 'メイン.鳥'>、<クラス 'メイン.動物'>、<クラス 'オブジェクト'>)