classmethod と staticmethod
次のコードを実行したときの出力として、正しいものを1つ選べ。
class A:
@classmethod
def make(cls):
return cls()
@staticmethod
def f(x):
return x * 2
class B(A):
pass
print(type(B.make()).__name__, A.f(3))
- A
A 6 - B
B 3 - C
B 6 - D
TypeErrorが発生する。
正解と解説を見る
正解:C
@classmethod の第 1 引数は呼び出されたクラス、@staticmethod は特別な引数を取らない。代替コンストラクタには classmethod を使う。
| 順 | 実行する行 | 実行後の変数 |
|---|---|---|
| 1 | `class A:` | — |
| 2 | └ `def make(cls):` | — |
| 3 | └ `@classmethod` | — |
| 4 | └ `def make(cls):` | — |
| 5 | └ `@classmethod` | — |
| 6 | └ `def make(cls):` | — |
| 7 | └ `@staticmethod` | — |
| 8 | └ `def f(x):` | — |
| 9 | └ `@staticmethod` | — |
| 10 | └ `def f(x):` | — |
| 11 | `class B(A):` | — |
| 12 | └ `pass` | — |
| 13 | `print(type(B.make()).__name__, A.f(3))` | — |
| 14 | └ `return cls()` | — |
| 15 | └ `return x * 2` | x = 3 |
| 結果 | 実際の出力 | B 6 |
- A
誤り。
B.make()のclsはB。 - B
誤り。
f(3)は 6。 - C
正しい。
classmethodは呼び出したクラス(B)をclsとして受け取る。staticmethodはクラスやインスタンスを受け取らない。 - D
誤り。呼び出しは有効。
このサイトの問題は、各試験の公式に示された出題範囲に沿って作ったオリジナルの模擬問題です。本試験の問題ではありません。一般社団法人Pythonエンジニア育成推進協会の公式サービスではありません。