3つの例を挙げます。
例1:(hayataka2049さんと同じ。Yugoでexclaimをオーバーライドしない)
例2:Carのexclaimの実装をYugoのexclaimで活用する
Python
1class Car:
2 ... # ご質問の定義と同じCarの定義
3
4class Yugo(Car):
5 def exclaim(self):
6 super().exclaim() # α: Yugoのインスタンスに対してCarのexclaimを適用
7 print("and I'm also a Yugo") # β: そして自身の独自実装を記述
8
9yugo = Yugo()
10yugo.exclaim()
11=>
12I'm a Car
13and I'm also a Yugo
例3:superの悪用
Python
1... # ご質問の定義と同じCar, Yugoの定義
2
3yugo = Yugo()
4yugo.exclaim() # => I'm a Yugo
5super(Yugo, yugo).exclaim() # => I'm a Car
Yugoでexclaimをオーバーライドした場合でもYugoのインスタンスに対してCarのexclaimの実装を適用することはsuper(※1)を使うと可能です。それを表したのが例2と例3です。しかし例3だけは「不適切」と思います。
Yugoクラスの実装者は例1あるいは例2のどちらかを選択できます。そして例2においてsuperを利用することはよいと思います。しかしながら例3はYugoの実装者がexclaimをオーバーライドしているにもかかわらずYugoの利用者が(勝手に)基底クラスCarのexclaimを適用してしまっています。このようなことは通常「すべきでない」です。こんなことを自由きままにやってしまうと設計が破綻しかねません。Yugoのインスタンスの整合はYugoの実装者が責任をもってクラス定義に盛り込むべきでありクラスの利用者は定義されたクラスをごく普通に使うのが適切でしょう。
オーバーライドされているメソッドについても基底クラスのメソッドの実装が継承されていると捉えることはよいのですがその事実を利用できるのは派生クラスの実装者だけ(※2)と考えたほうがよいと思います。
※1: super
Pythonの日本語リファレンス
https://docs.python.org/ja/3.7/library/functions.html#super
および上記リファレンスからのリンク(英語)
https://rhettinger.wordpress.com/2011/05/26/super-considered-super/
※2: 派生クラスの実装者だけがsuperを使うべき?
実際はメタプログラミング(デコレーターとかメタクラスとか)などのより高度なプログラミングテクニック(黒魔術的テクニック?)まで話題を広げると「必ずしもそうとは言い切れない」のかも知れません。が、この回答では「Pythonのクラス機能を用いていわゆる一般のアプリケーションの設計をする立場」として意見を述べました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/10/08 13:18