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