協調的な super
次のコードを実行したときの出力として、正しいものを1つ選べ。
class A:
def f(self):
return ["A"]
class B(A):
def f(self):
return ["B"] + super().f()
class C(A):
def f(self):
return ["C"] + super().f()
class D(B, C):
def f(self):
return ["D"] + super().f()
print(D().f())
- A
['D', 'B', 'A'] - B
['D', 'B', 'C', 'A'] - C
['D', 'B', 'A', 'C'] - D
['D']
正解と解説を見る
正解:B
super() は「親クラス」ではなく、MRO の次のクラスを呼ぶ。多重継承(ダイヤモンド継承)でも、各クラスが 1 回ずつ呼ばれる。
| 順 | 実行する行 | 実行後の変数 |
|---|---|---|
| 1 | `class A:` | — |
| 2 | └ `def f(self):` | — |
| 3 | `class B(A):` | — |
| 4 | └ `def f(self):` | — |
| 5 | `class C(A):` | — |
| 6 | └ `def f(self):` | — |
| 7 | `class D(B, C):` | — |
| 8 | └ `def f(self):` | — |
| 9 | `print(D().f())` | — |
| 10 | └ `return ["D"] + super().f()` | — |
| 11 | └ `return ["B"] + super().f()` | — |
| 12 | └ `return ["C"] + super().f()` | — |
| 13 | └ `return ["A"]` | — |
| 結果 | 実際の出力 | ['D', 'B', 'C', 'A'] |
- A
誤り。B の
super()は、MRO の次の C を呼ぶ。 - B
正しい。
super()は MRO(D, B, C, A)に沿って次のクラスを呼ぶ。B のsuper()は、A ではなく C を呼ぶ。 - C
誤り。MRO では、C が A より先。
- D
誤り。
super()で、親の処理も呼ばれる。
このサイトの問題は、各試験の公式に示された出題範囲に沿って作ったオリジナルの模擬問題です。本試験の問題ではありません。一般社団法人Pythonエンジニア育成推進協会の公式サービスではありません。