67122


お世話になっております。Python初心者です。

オブジェクト指向の継承の分野を学習しているのですが、  
分からないことがありこちらで質問させていただきます。

コードはオライリージャパンの『入門Python3 』の６章からです。  
このリンクの２つめにもあります。  
<https://qiita.com/Taka20200105/items/274f5863294429d74bba>

[code]

    class Car():
        def exclaim(self):
            print('Im a car.')
    
    class Yugo(Car):
        def exclaim(self):
            print("I'm a Yugo! Much like a Car, but more Yugo-ish")
    
    give_me_a_Yugo = Yugo()
    
    give_me_a_Yugo.exclaim()
    
[/code]

なぜ、give_me_a_Yugoオブジェクトがexclaimメソッドを  
呼び出すと print('Im a car.')を実行しないでしょうか？  
私のオブジェクト指向の継承の認識は新クラスが、親クラスのメソッドを  
全て持っているという認識です。それなら、新クラスが親クラスのprint('Im a car.')  
を実行してもおかしくないと思います。  
知識不足などご指摘ください。

編集内容  
※１ 新クラスはYugo(Car)です。  
※２ 実行結果は  
I'm a Yugo! Much like a Car, but more Yugo-ish  
です。


CC BY-SA 4.0
2020-05-29T08:36:37.147
67120
2020-05-29T08:49:35.600
2020-05-29T08:42:34.687
39846
39846
question
python python3
Pythonのオブジェクト指向の継承について教えて下さい。


一般的なオブジェクト指向の言い方で説明すると、これはメソッドのオーバーライドをしています。子クラスが親クラスのメソッドを上書きしているような挙動をします。つまりある名前のメソッドを呼び出そうとしたとき、その名前のメソッドが自分に実装されているのであれば親クラス側のメソッドが直接呼び出されることはありません。

明示的に親クラスの同名メソッドを呼び出してあげると、親クラスのメソッドも実行されます。

[code]

    class Car():
        def exclaim(self):
            print('Im a car.')
    
    class Yugo(Car):
        def exclaim(self):
            super().exclaim()  # ←親の exclaim も実行する
            print("I'm a Yugo! Much like a Car, but more Yugo-ish")
    
[/code]

Python 固有の話をすると、Python
においては子クラスが親クラスのメソッドを「持っている」というよりかは、メソッドのありかが探索されるときに子クラスに無ければ親クラスが探される、という言い方をしたほうが実情に近いです。たとえば
`Yugo` クラスのインスタンスに対して `exclaim` メソッドが呼び出されたら、まずは `Yugo` クラスが `exclaim`
を実装しているか探索され、もし無ければ親である `Car` クラスが探索されます。Python ではこの探索順序のことを method resolution
order (MRO) と呼んでおり、だいたいクラスの継承関係に沿って定義されています。


CC BY-SA 4.0
2020-05-29T08:49:35.600
67122
2020-05-29T08:49:35.600
19110
67120
answer