Python MRO(メソッド解決順序)

Zeeshan Afridi 2023年6月21日
Python MRO(メソッド解決順序)

多重継承とは、単一のサブクラスが複数のクラスを継承できることを意味し、サブクラスは、その特定のクラスに対して非公開でない限り、属性と関数へのアクセスを許可されます。 そこでは、MRO 手法を使用して、実行中のクラスの順序を検索します。

この記事では、Python MRO(Method Resolution Order)について学びます。

Python の MRO (メソッド解決順序)

MRO は、クラス階層でメソッドが検索される Python の順序です。 ほとんどの場合、サブクラスの親クラスでメソッドと属性を探すために使用されます。

まず、継承しながら指定された順序に従って、サブクラス内で属性またはメソッドが検索されます。 この順序はクラスの線形化とも呼ばれ、順序を確認しながら一連のルールが適用されます。

他のクラスから継承する場合、コンパイラは、クラスのインスタンスを介して呼び出されるメソッドを解決する適切な方法を必要とします。 基本クラスの複数の親に同じ関数がある場合、多重継承で重要な役割を果たします。

コード例:

class A(object):
    def dothis(self):
        print("This is A class")


# Class B is inheriting Class A
class B(A):
    def dothis(self):
        print("This is B class")


# Class C is inheriting Class B
class C(B):
    def dothis(self):
        print("This is C class")


# Class D is inheriting Class C and B
class D(C, B):
    def dothis(self):
        print("This is D class")


# creating the object of Class D
d_obj = D()

# calling funtion dothis()
d_obj.dothis()
print(D.mro())

出力:

This is D class
[<class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]

上記の例では、関数 dothis() はすべてのクラスで使用できます。 クラスDのオブジェクトd_objを使用して呼び出すと、まず現在のクラスでそれをチェックします。

そこにある場合は、関数を返します。 それ以外の場合は、mro() 関数の規則に従って親クラスを調べ続けます。

さらに、クラスの順序を知るには、上記の例 D.mro() で示されているように、現在のクラス名を使用して mro() 関数を呼び出します。 現在の順番はクラス D -> クラス C -> クラス B -> クラス Aであり、継承時に適宜変更できます。

著者: Zeeshan Afridi
Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn