質問: Python3 基礎認定試験の勉強をしていますが、Prime Studyの模擬試験で、回答をみても何故そうなるのか分かりません。ご説明いただけるとありがたいです。 **問題** ``` [A][B][C]に入る適切な選択肢を選べ 【実行結果】 Need Speed? I'm Saya. Need Speed? I'm David. ``` ``` class Kusanagi(): def s(self): print("Need Speed?") [A] def m(self): print("I'm Saya.") class wexal(kusanagi): def [B]: print("I'm David.") k=kusanagi() w=wexal k.s() w.[C] ``` **回答** ``` [A] self.m() [B] m(self) [C] s() ``` **疑問** * [A] の `self.m()` の意味がわかりません * [B] はインスタンス化しているということでしょうか? * [C] は空の `()` を定義しているのでしょうか? ご教示よろしくお願いいたします。
回答: ちなみに質問時の転記ミスでしょうか、classが`Kusanagi`で他は`kusanagi`と、`K`の大文字小文字が混在しています。 そして`w=wexal`では後ろの`()`が不足しています。 クラスの継承とメソッドのオーバーライドに関するものですね。 例えばこちらの記事が参考になるでしょう。 【Python入門】クラスの継承、メソッドのオーバーライドとsuper その上で、答えは以下になります。 **[A]の`self.m()`の意味がわかりません** 自分のインスタンスの`m`メソッドを呼び出しています。 **[B]はインスタンス化しているということでしょうか?** 親クラスのメソッドと同じ名前のメソッドをオーバーライドして定義しています。 `wexal`クラスインスタンスで`m`メソッドが実行された場合は、こちらの処理が行われます。 **[C]は空の`()`を定義しているのでしょうか?** `wexal`クラスの`s`メソッドを呼び出しています。 `wexal`自身には`s`メソッドが無いので、親クラスから継承した`s`メソッドを実行します。 `s`メソッドを呼び出す際の`self`は`wexal`クラスのインスタンスなので、`s`メソッドの中で`self.m()`を実行した場合は`wexal`クラスの`m`メソッドが実行されて、表示するのは`I'm David.`になります。 この部分のコードを実行して: ``` k=kusanagi() w=wexal() k.s() w.[C] ``` こちらの結果を得るためには: ``` Need Speed? I'm Saya. Need Speed? I'm David. ``` 大体以下のような考え方が必要で、その結果として答えが決定されます。 * 2つのクラスのインスタンスのそれぞれ1回の呼び出しで、上記4行の表示が必要 * つまり1回の呼び出しで2行表示される * `kusanagi`クラスの`s`メソッドで2行目の`I'm Saya.`が表示されるためには、`s`メソッドの中で自身の`m`メソッドを呼ぶ必要がある → **[A]の回答** * `kusanagi`クラスを継承した`wexal`クラスで1行目(表示としては3行目)の`Need Speed?`が表示されるためには、`s`メソッドを呼ぶ必要がある → **[C]の回答** * `kusanagi`クラスを継承した`wexal`クラスの`s`メソッドで2行目(表示としては4行目)に`I'm David.`が表示されるためには、`m`メソッドをオーバーライド(同名のメソッドを定義)して、その中で`I'm David.`を表示する必要がある → **[B]の回答**