クラス属性の探索
次のコードを実行したときの出力として、正しいものを1つ選べ。
class A:
x = 1
class B(A):
pass
b = B()
B.x = 2
print(b.x, A.x)
- A
1 1 - B
2 2 - C
1 2 - D
2 1
正解と解説を見る
正解:D
属性の探索は、インスタンス、クラス、親クラス(MRO の順)。子クラスで同名の属性を定義すると、親の属性を隠す(上書きではない)。
| 順 | 実行する行 | 実行後の変数 |
|---|---|---|
| 1 | `class A:` | — |
| 2 | └ `x = 1` | x = 1 |
| 3 | `class B(A):` | — |
| 4 | └ `pass` | — |
| 5 | `b = B()` | — |
| 6 | `B.x = 2` | — |
| 7 | `print(b.x, A.x)` | — |
| 結果 | 実際の出力 | 2 1 |
- A
誤り。
Bに属性xが追加され、先に見つかる。 - B
誤り。
Aの属性は変わらない。 - C
誤り。値が逆。
- D
正しい。属性は、インスタンス → クラス → 親クラスの順に探される。
B.x = 2でBに属性ができ、A.xはそのまま。
このサイトの問題は、各試験の公式に示された出題範囲に沿って作ったオリジナルの模擬問題です。本試験の問題ではありません。一般社団法人Pythonエンジニア育成推進協会の公式サービスではありません。