Python 模擬試験

Python実践 模擬試験 第6回 問12・4章 Pythonのクラス(継承)

協調的な 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())
  1. A

    ['D', 'B', 'A']

  2. B

    ['D', 'B', 'C', 'A']

  3. C

    ['D', 'B', 'A', 'C']

  4. 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']

学習のポイント:MRO は クラス.__mro__ で確認できる。

この問題を演習で解く →

問題一覧へ

このサイトの問題は、各試験の公式に示された出題範囲に沿って作ったオリジナルの模擬問題です。本試験の問題ではありません。一般社団法人Pythonエンジニア育成推進協会の公式サービスではありません。