メソッド解決順序 (Method Resolution Order, MRO) を理解する
このステップでは、Python のメソッド解決順序 (Method Resolution Order, MRO) について学びます。MRO は、Python がクラス階層内でメソッドを検索する順序です。多重継承を扱う際に特に重要です。
MRO を説明するために、新しいクラスのセットを作成しましょう。VS Code エディタを使用して、~/project
ディレクトリに animal.py
という名前のファイルを作成します。
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return "Generic animal sound"
class Mammal(Animal):
def speak(self):
return "Generic mammal sound"
class Dog(Mammal):
def speak(self):
return "Woof!"
class Cat(Mammal):
def speak(self):
return "Meow!"
animal.py
ファイルを保存します。
次に、~/project
ディレクトリに mro_example.py
という名前の新しいファイルを作成して、MRO を実証しましょう。
from animal import Animal, Mammal, Dog, Cat
my_dog = Dog("Buddy")
my_cat = Cat("Whiskers")
print(my_dog.speak())
print(my_cat.speak())
mro_example.py
ファイルを保存します。
この例では:
Animal
は speak
メソッドを持つ基底クラスです。
Mammal
は Animal
を継承し、speak
メソッドをオーバーライドします。
Dog
は Mammal
を継承し、speak
メソッドをオーバーライドします。
Cat
は Mammal
を継承し、speak
メソッドをオーバーライドします。
my_dog.speak()
を呼び出すと、Python はまず Dog
クラス内で speak
メソッドを探します。そこで見つからない場合は、Mammal
クラス、次に Animal
クラスを探します。この順序は MRO によって決まります。
mro_example.py
スクリプトを実行するには、ターミナルを開き、~/project
ディレクトリに移動します。
cd ~/project
次に、python
コマンドを使用してスクリプトを実行します。
python mro_example.py
以下の出力が表示されるはずです。
Woof!
Meow!
次に、多重継承を使ったより複雑な例を見てみましょう。~/project
ディレクトリに mro_complex.py
という名前の新しいファイルを作成します。
class A:
def method(self):
return "A"
class B(A):
def method(self):
return "B"
class C(A):
def method(self):
return "C"
class D(B, C):
pass
d = D()
print(d.method())
print(D.mro())
mro_complex.py
ファイルを保存します。
この例では:
- クラス
D
は B
と C
の両方を継承しています。
B
と C
はどちらも A
を継承しています。
method
は A
、B
、C
のすべてのクラスで定義されています。
mro_complex.py
スクリプトを実行するには、ターミナルを開き、~/project
ディレクトリに移動します。
cd ~/project
次に、python
コマンドを使用してスクリプトを実行します。
python mro_complex.py
以下の出力が表示されるはずです。
B
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
出力の B
は、クラス B
の method
が呼び出されたことを示しています。D.mro()
メソッドは、クラス D
のメソッド解決順序を表すタプルを返します。この場合、MRO は D -> B -> C -> A -> object
です。つまり、d.method()
を呼び出すと、Python はまずクラス D
内でメソッドを探し、次にクラス B
、次にクラス C
、次にクラス A
、最後に基底クラス object
を探します。
MRO を理解することは、継承、特に多重継承を使用する際にコードの動作を予測するために不可欠です。