4章「Pythonのクラス」の対策ポイントと例題
4章「Pythonのクラス」からは本番40問中3問が出ます。継承・特殊メソッド・データクラスなど、オブジェクト指向の書き方そのものを問う章です。
- dataclass
- 継承
- MRO
- property
- 特殊メソッド
- classmethod
- staticmethod
この章の出題数と位置づけ
4章「Pythonのクラス」からは本番40問のうち3問が出題されます。 全体に占める割合は7.5%で、15章中4番目タイの出題数です(同じ3問の章が他に1章あります)。 合格に必要なのは28問正解(12問まで不正解可)なので、 この章の3問をどこまで取りに行くかは、他の章との兼ね合いで決めるのが現実的です。
対策のポイント
- @dataclass が自動生成するもの(__init__ / __repr__ / __eq__)と、生成しないものを区別します。
- 多重継承時の属性探索順(MRO)は、クラス定義を読んで解決順を答えさせる形で出ます。
- classmethod は第1引数が cls、staticmethod は自動で渡る引数なし、という違いが選択肢になります。
- __str__ と __repr__ の使い分け、property による読み取り専用属性の作り方も範囲です。
この章の例題(3問)
当サイトで実際に出題している問題から3問を、正解と解説つきで掲載します。 すべて自作のオリジナル問題で、実際の試験問題ではありません。
例題1. @staticmethod と @classmethod の違いとして正しいものを選べ。
- 正解classmethod は第1引数にクラス自身を受け取るが、staticmethod は何も受け取らない
- staticmethod は第1引数にインスタンスを受け取る
- classmethod はインスタンスからは呼び出せない
- staticmethod はサブクラスに継承されない
解説: classmethod は cls を受け取るので、サブクラスから呼ぶと呼んだ側のクラスが入る。代替コンストラクタの実装に使う。staticmethod は単に名前空間をクラス内に置いた関数。
例題2. クラス内で __value という名前の属性を定義したとき、Python が内部で行う処理はどれか。
- 正解_クラス名__value という名前に変換される
- 外部から一切アクセスできなくなる
- 読み取り専用のプロパティになる
- 特に何も起きず、通常の属性と同じ
解説: アンダースコア2つで始まる名前は名前マングリングの対象。完全な private ではなく、_ClassName__value でアクセスできてしまう。前後をアンダースコア2つで挟んだ __init__ 等はマングリングされない。
例題3. 多重継承したクラスのメソッド解決順序を確認したい。参照すべき属性はどれか。
- 正解__mro__
- __bases__
- __dict__
- __class__
解説: __mro__(または mro() メソッド)が解決順序のタプルを返す。__bases__ は直接の親クラスだけで、順序の全体像は分からない。
この章は当サイトに全6問を収録しています。残りはドリルの「章別に解く」から解けます。