Python3エンジニア認定基礎試験 第9章 クラス 予想問題と解説
Python3エンジニア認定基礎試験「第9章 クラス」の予想問題を7問収録しています。各問を解説つきで掲載し、全問は演習画面で解けます。公式シラバスの範囲で作成しています。
この章の要点
クラスの定義とインスタンス・継承とプライベート変数・スコープと名前空間・イテレータとジェネレータなどを扱う分野です。全7問(基礎1問・標準5問・応用1問)を収録しています。
- クラスの定義とインスタンス
- 継承とプライベート変数
- スコープと名前空間
- イテレータとジェネレータ
情報源と編集区分
公式範囲を確認し、問題数・難易度・確認点は当サイトが集計・編集。 一次情報確認日: 2026-09-18。
試験概要(公式)確認しておきたいポイント
当サイトの作問時に観察した、取り違えやすい論点です(公式の統計ではありません)。
- メソッドの最初の引数 self の扱い。公式チュートリアル9.4は「この名前付けは単なる慣習でしかありません。self という名前は、Python では何ら特殊な意味を持ちません」と述べており、予約語ではない。ただし慣習に従わないと読みにくくなるとも述べている。
- クラス変数とインスタンス変数の混同。どちらに属する値かで、他のインスタンスへの影響が変わる。
- 最初の引数を省略できると思い込むこと。インスタンスのメソッドは最初の引数でインスタンス自身を受け取るため省略できない。
よくある質問
Q第9章 クラスは何問収録されていますか?
現在7問を収録しています。内訳は基礎1問・標準5問・応用1問です。
Q第9章 クラスの頻出論点は何ですか?
クラスの定義とインスタンス・継承とプライベート変数・スコープと名前空間・イテレータとジェネレータなどが出題対象です(当サイト収録問題に基づく編集部集計)。
Q間違えた問題はどう復習すればいいですか?
誤答した選択肢のどこがずれていたかを解説で確認し、関連用語がある場合は用語集で定義に戻ってから再演習することをおすすめします。
クラスのメソッドの最初の引数について、正しい説明はどれか。
答えと解説を見る
正解は「呼び出したインスタンス自身を受け取る引数で、慣習として self と名付ける」である。インスタンスのメソッドは最初の引数でそのインスタンス自身を受け取り、その名前は慣習として self が使われる。self という名前は言語の予約語ではないが、慣習に従うのが読みやすさの面で望ましい。クラス自身を受け取る形は別の種類のメソッドの話で、名前が固定されているわけでもない。最初の引数を書かずに省略することはできず、戻り値を入れるための引数でもない。
https://docs.python.org/ja/3/tutorial/classes.html (Python公式チュートリアル 第9章 クラス、2026-09-11確認)
クラス定義の中で __spam のように先頭に2つのアンダースコアを持つ識別子を使ったとき、Pythonが行う処理として正しいものはどれか。
答えと解説を見る
正解は「_クラス名__spam の形式に置き換える名前修飾(マングリング)を行う」である。公式チュートリアルは、先頭に2個以上、末尾に1個以下のアンダースコアを持つ識別子は_classname__spamの形にテキスト置換されると説明しており、classnameは先頭のアンダースコアを取り除いた現在のクラス名である。この仕組みはサブクラスが内部のメソッド呼び出しを壊さずにメソッドをオーバーライドできるようにするためのものであり、Pythonにはオブジェクトの外から一切アクセスできない真にプライベートな変数は存在しない。名前修飾は主に不慮の名前衝突を防ぐためのもので、確信犯的にアクセスすることは依然として可能である。単に先頭のアンダースコアを取り除くだけの処理ではなく、構文エラーにもならない。
https://docs.python.org/ja/3/tutorial/classes.html (Python公式チュートリアル 第9章 クラス、2026-09-15確認)
Pythonにおける名前空間とスコープの説明として、正しい組み合わせはどれか。
答えと解説を見る
正解は「名前空間は名前からオブジェクトへの対応付けで、スコープはその名前空間へ直接アクセスできるプログラム上の領域である」である。公式チュートリアルは、名前空間を名前からオブジェクトへの対応付け、スコープをある名前空間へ直接アクセスできるPythonプログラムのテキスト上の領域と定義している。ここで直接アクセスとは、名前の前に修飾を付けず参照したとき、その名前空間から名前を探すことをいう。したがって両者は関係するが同じ概念ではなく、定義を入れ替えた説明は誤りである。また、名前空間はオブジェクトを置くメモリ領域そのものではなく、スコープもオブジェクトの寿命を表す語ではない。名前空間をモジュール名だけ、スコープをクラス内部だけに限定する説明も、それぞれの定義を不当に狭めている。
https://docs.python.org/ja/3/tutorial/classes.html (Python公式チュートリアル 第9章 クラス、2026-09-18確認)
yield文を含むジェネレータに対してnext()を繰り返し呼んだときの動作として、正しいものはどれか。
答えと解説を見る
正解は「以前に中断した処理を再開し、ローカル変数と実行状態を呼び出しの間で保持する」である。公式チュートリアルは、ジェネレータを通常の関数のように書き、データを返すときにyield文を使うと説明している。next()が呼び出されるたびに、ジェネレータは以前に中断した処理を再開し、すべてのデータ値と最後に実行した文を記憶する。このため、毎回関数の先頭へ戻ってローカル変数を初期化するわけではなく、最初から全結果をリストにまとめて返す動作でもない。また、ジェネレータでは__iter__()と__next__()が自動で作成されるため、利用者がこの2つを手作業で追加する必要はない。処理が終了するとStopIterationも自動的に送出される。
https://docs.python.org/ja/3/tutorial/classes.html (Python公式チュートリアル 第9章 クラス、2026-09-18確認)
class Team: members = [] のように定義し、__init__ では self.name = name だけを行い、メソッド add_member では self.members.append(person) を実行する設計にした。異なる名前で作成した複数のTeamインスタンスでadd_memberを呼んだときに起こることとして、正しいものはどれか。
答えと解説を見る
正解は「membersはクラス変数としてすべてのインスタンスで共有されるため、あるインスタンスのadd_memberで追加した要素が他のインスタンスのmembersにも現れる」である。公式チュートリアルは、クラス変数を『そのクラスのすべてのインスタンスによって共有される属性』、インスタンス変数を『それぞれのインスタンスについて固有のデータ』と説明しており、class文の直下でmembers = []のように書いた変数はクラス変数になる。self.membersに対してappendのような変更操作を行うと、共有された同じリストオブジェクトが変更されるため、他のインスタンスから見ても変化が現れる。一方、self.name = nameのように__init__の中でselfへ代入した変数はインスタンス変数であり、インスタンスごとに固有のデータになるため、他のインスタンスのnameには影響しない。公式チュートリアルは、リストや辞書のような可変オブジェクトをクラス変数にすると、全インスタンスで共有されてしまう場合があると注意している。
https://docs.python.org/ja/3/tutorial/classes.html (Python公式チュートリアル 第9章 クラス、2026-09-24確認)
インスタンスx に対する x.f() という呼び出しと、メソッドオブジェクトの仕組みについて、正しい説明はどれか。
答えと解説を見る
正解は「x.f()はMyClass.f(x)と厳密に等価であり、インスタンスの非データ属性が関数オブジェクトとして見つかると、インスタンスと関数への参照がメソッドオブジェクトにパックされる」である。公式チュートリアルは、x.f()という呼び出しがMyClass.f(x)と厳密に等価であると述べている。インスタンスの非データ属性が参照されたとき、そのインスタンスのクラスが検索され、見つかった属性が関数オブジェクトであれば、インスタンスへの参照と関数オブジェクトへの参照がメソッドオブジェクトにパックされると説明されている。このメソッドオブジェクトはm.__self__でインスタンスを、m.__func__で対応する関数オブジェクトを参照する属性を持つ。xを渡す必要がないという説明や、m.__func__とm.__self__の対応を入れ替えた説明、メソッドオブジェクトが関数オブジェクトへの参照を持たないという説明は、いずれも公式チュートリアルの記載と一致しない。
https://docs.python.org/ja/3/tutorial/classes.html (Python公式チュートリアル 第9章 クラス、2026-09-24確認)
class DerivedClassName(Base1, Base2, Base3): のように複数の基底クラスを指定したとき、属性の探索順序について正しい説明はどれか。
答えと解説を見る
正解は「深さ優先・左から右の順で探索され、まずBase1とその基底クラスを再帰的に探索し、見つからなければBase2を探索する。ただし同じクラスが継承階層に複数回現れる場合は2度探索しない」である。公式チュートリアルは、class DerivedClassName(Base1, Base2, Base3):のような定義における属性の探索が深さ優先・左から右で行われ、まずBase1とその基底クラスを再帰的に探索し、見つからなければBase2を探索すると説明している。また、同じクラスが継承階層で複数回現れる場合(ダイアモンド継承)は2度探索しないとし、協調的なsuper()呼び出しに対応するためメソッド解決順序(MRO)は動的なアルゴリズムで線形化されると述べている。Base3から先に探索するという説明や、3つを同時に探索して最後に書かれたものを優先するという説明、探索順序が定義されていないという説明は、いずれも公式チュートリアルの記載と一致しない。
https://docs.python.org/ja/3/tutorial/classes.html (Python公式チュートリアル 第9章 クラス、2026-09-24確認)