質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1482閲覧

classの継承について

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/10/07 14:17

pythonのクラスの継承を学んでいるのですが仕組みがよくわかりません。
下記の場合Carが親クラスでYugoがサブクラスという認識を持っているのですがその認識は合っていますか?
またサブクラスは親クラスができることを継承できるとのことだったのですが、下記の場合どのようなコードを書けばサブクラスを用いて"I'm a Car"を出力できますか?

python

1class Car(): 2 def exclaim(self): 3 print("I'm a Car") 4 5class Yugo(Car): 6 def exclaim(self): 7 print("I'm a Yugo") 8 9give_Car=Car() 10give_Yugo=Yugo() 11

出力結果

pyhton

1give_Car.exclaim() 2"I'm a Car" 3give_Yugo.excliam() 4"I'm Yugo"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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 07:38

編集2018/10/08 09:14
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/08 13:18

そんなに多くの書き方があるとは思いませんでした。詳しく書いていただきありがとうございました。
guest

0

下記の場合Carが親クラスでYugoがサブクラスという認識を持っているのですがその認識は合っていますか?

合っています。

サブクラスは親クラスができることを継承できるとのことだったのですが、下記の場合どのようなコードを書けばサブクラスを用いて"I'm a Car"を出力できますか?

exclaimをオーバーライドしてしまっているので、それをやめます。

最も単純な例としては、

python

1class Car(): 2 def exclaim(self): 3 print("I'm a Car") 4 5class Yugo(Car): 6 pass 7 8give_Car=Car() 9give_Yugo=Yugo() 10 11give_Car.exclaim() # => I'm a Car 12give_Yugo.exclaim() # => I'm a Car 13

投稿2018/10/07 14:32

編集2018/10/07 14:33
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問