

Python3 基礎認定試験の勉強をしていますが、Prime
Studyの模擬試験で、回答をみても何故そうなるのか分かりません。ご説明いただけるとありがたいです。

**問題**

[code]

    [A][B][C]に入る適切な選択肢を選べ 
    
    【実行結果】
    Need Speed?
    I'm Saya.
    Need Speed?
    I'm David.
    
[/code]

[code]

    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]
    
[/code]

**回答**

[code]

    [A] self.m()
    [B] m(self)
    [C] s()
    
[/code]

**疑問**

  * [A] の `self.m()` の意味がわかりません
  * [B] はインスタンス化しているということでしょうか？
  * [C] は空の `()` を定義しているのでしょうか？

ご教示よろしくお願いいたします。


CC BY-SA 4.0
2020-11-25T14:21:51.100
72206
2021-01-10T08:41:35.337
2020-11-25T16:43:51.833
3060
42860
question
python
Python3 模擬試験でどうしても理解できない問題があり、教えていただきたい


ちなみに質問時の転記ミスでしょうか、classが`Kusanagi`で他は`kusanagi`と、`K`の大文字小文字が混在しています。  
そして`w=wexal`では後ろの`()`が不足しています。

* * *

クラスの継承とメソッドのオーバーライドに関するものですね。  
例えばこちらの記事が参考になるでしょう。  
[【Python入門】クラスの継承、メソッドのオーバーライドとsuper](https://code-graffiti.com/class-
inheritance-in-python/)

その上で、答えは以下になります。

**[A]の`self.m()`の意味がわかりません**

自分のインスタンスの`m`メソッドを呼び出しています。

**[B]はインスタンス化しているということでしょうか？**

親クラスのメソッドと同じ名前のメソッドをオーバーライドして定義しています。  
`wexal`クラスインスタンスで`m`メソッドが実行された場合は、こちらの処理が行われます。

**[C]は空の`()`を定義しているのでしょうか？**

`wexal`クラスの`s`メソッドを呼び出しています。

`wexal`自身には`s`メソッドが無いので、親クラスから継承した`s`メソッドを実行します。  
`s`メソッドを呼び出す際の`self`は`wexal`クラスのインスタンスなので、`s`メソッドの中で`self.m()`を実行した場合は`wexal`クラスの`m`メソッドが実行されて、表示するのは`I'm
David.`になります。

* * *

この部分のコードを実行して：

[code]

    k=kusanagi()
    w=wexal()
    k.s()
    w.[C] 
    
[/code]

こちらの結果を得るためには：

[code]

    Need Speed?
    I'm Saya.
    Need Speed?
    I'm David.
    
[/code]

大体以下のような考え方が必要で、その結果として答えが決定されます。

  * 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]の回答**


CC BY-SA 4.0
2020-11-25T15:06:05.403
72207
2021-01-10T08:41:35.337
2021-01-10T08:41:35.337
26370
26370
72206
answer