Python 多重継承
Python 多重継承
このチュートリアルでは、Python の多重継承と、それをプログラムで使用する方法について学習します。マルチレベル継承とメソッド解決順序についても学びます。
Python の多重継承
C++ と同様に、Python では複数の基本クラスからクラスを派生させることができます。これは多重継承と呼ばれます。
多重継承では、すべての基本クラスの機能が派生クラスに継承されます。多重継承の構文は単一継承に似ています。
例
class Base1:
pass
class Base2:
pass
class MultiDerived(Base1, Base2):
pass
ここで、MultiDerived クラスは Base1 から派生します と Base2 クラス。
<図>
MultiDerived クラスは両方の Base1 から継承します と Base2 クラス。
Python マルチレベル継承
派生クラスから継承することもできます。これをマルチレベル継承と呼びます。 Python では任意の深さにすることができます。
マルチレベル継承では、基本クラスと派生クラスの機能が新しい派生クラスに継承されます。
対応する視覚化の例を以下に示します。
class Base:
pass
class Derived1(Base):
pass
class Derived2(Derived1):
pass
ここでは、Derived1 クラスは Base から派生します クラス、および Derived2 クラスは Derived1 から派生しています クラス。
<図>
Python でのメソッド解決の順序
Python のすべてのクラスは object
から派生しています クラス。 Python の最も基本的な型です。
したがって、技術的には、組み込みまたはユーザー定義の他のすべてのクラスは派生クラスであり、すべてのオブジェクトは object
のインスタンスです クラス。
# Output: True
print(issubclass(list,object))
# Output: True
print(isinstance(5.5,object))
# Output: True
print(isinstance("Hello",object))
多重継承のシナリオでは、指定された属性が現在のクラスで最初に検索されます。見つからない場合、同じクラスを 2 回検索することなく、深さ優先、左から右の方法で親クラスに検索を続けます。
したがって、上記の MultiDerived
の例では クラスの検索順序は [MultiDerived
] です 、 Base1
、 Base2
、 object
]。この順序は MultiDerived
の線形化とも呼ばれます クラスであり、この順序を見つけるために使用される一連のルールは メソッド解決順序 (MRO) と呼ばれます .
MRO は、ローカルの優先順位付けを防止し、単調性も提供する必要があります。クラスが常にその親の前に表示されるようにします。複数の親の場合、順序は基本クラスのタプルと同じです。
クラスの MRO は __mro__
として表示できます 属性または mro()
方法。前者はタプルを返し、後者はリストを返します。
>>> MultiDerived.__mro__
(<class '__main__.MultiDerived'>,
<class '__main__.Base1'>,
<class '__main__.Base2'>,
<class 'object'>)
>>> MultiDerived.mro()
[<class '__main__.MultiDerived'>,
<class '__main__.Base1'>,
<class '__main__.Base2'>,
<class 'object'>]
これは、もう少し複雑な多重継承の例と、MRO を使用したその視覚化です。
<図>
# Demonstration of MRO
class X:
pass
class Y:
pass
class Z:
pass
class A(X, Y):
pass
class B(Y, Z):
pass
class M(B, A, Z):
pass
# Output:
# [<class '__main__.M'>, <class '__main__.B'>,
# <class '__main__.A'>, <class '__main__.X'>,
# <class '__main__.Y'>, <class '__main__.Z'>,
# <class 'object'>]
print(M.mro())
出力
[<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]
MRO の計算方法に関する実際のアルゴリズムを知るには、MRO に関するディスカッションをご覧ください。
Python