home changes contents help options

248:多重継承する

Python ではクラスを多重継承することができます。次のコードはクラス A, B 双方を親とするクラス C を定義しています。

>>> class A(object):
...   a = 1
...
>>> class B(object):
...   b = 2
...
>>> class C(A, B):
...   c = 3
...
>>> C.a
1
>>> C.b
2
>>> C.c
3

クラス属性の参照を行う際の名前解決の規則は object を親とする新スタイルクラスと、そうではないクラシックスタイルで異なります。クラシッククラスは Python 3.0 で削除されるものなので、ここでは新スタイルクラスに絞って説明します。

親を上とするクラスツリーを描いた場合、属性の検索順は「左から右」「下から上」です。

  A
B   C
  D

クラス D の属性を検索した場合、 D, B, C, A の順番で検索されます。 D.x にアクセスした場合、 D.x, B.x 属性は存在しませんが C.x 属性が存在するので、 2 となります。 C.x が見つかったので、ここで探索が打ち切られ、 A.x には触れられません。

>>> class A(object):
...   x = 1
...
>>> class B(A):
...   pass
...
>>> class C(A):
...   x = 2
...
>>> class D(B, C):
...   pass
...
>>> D.x
2