🙆

Python100本ノック#7 メソッド解決順序(MRO:Method Resolution Order)

2023/11/29に公開

メソッド解決順序(MRO:Method Resolution Order)とは

クラスのメソッド実行時に、どのクラスからどういう順番から呼び出されるかを解析するためのメソッドである。メソッドを解析する時に利用されることが多い。

基本文法

クラス名.__mro__
クラス名.mro()

具体例

class Car(object):
    def __init__(self, brand, model, color):
        self.brand = brand
        self.model = model
        self.color = color
     def run(self):
        print('i can run')
        
class GasolineCar(Car):
    def __init__(self, brand, model, color):
        super().__init__(brand, model, color)
        
    def run(self):
        print('i can run with gasoline')
        
lass HybridCar(Car):
    def __init__(self, brand, model, color):
        super().__init__(brand, model, color)
        # バッテリー属性
        self.battery = 70

    def run(self):
        print(f'i can run with gasoline also electric,remain:{self.battery}')
        
print(HybridCar.__mro__)
print(HybridCar.mro())

output

左から右への順番で解析されることになっている。

(<class '__main__.HybridCar'>, <class '__main__.Car'>, <class 'object'>)
[<class '__main__.HybridCar'>, <class '__main__.Car'>, <class 'object'>]

クラス継承におけるMROメソッドの解析順序

継承においては、クラス内で属性orメソッドを呼び出す時に

  1. まず、自身のクラス内で解析
  2. 見つかったら止まる。見つからない場合は、継承元(親クラス)内で解析
  3. Objectは全クラスの基底であるため、Objectで終了する。

感想

継承関係が複雑になりすぎるときにコード解析に必要に役立ちそう。

Discussion