AI資格ドリル
資格を選ぶ↓

Python3エンジニア認定基礎試験 第9章 クラス 予想問題と解説

Python3エンジニア認定基礎試験「第9章 クラス」の予想問題を7問収録しています。各問を解説つきで掲載し、全問は演習画面で解けます。公式シラバスの範囲で作成しています。

この章の要点

クラスの定義とインスタンス・継承とプライベート変数・スコープと名前空間・イテレータとジェネレータなどを扱う分野です。全7問(基礎1問・標準5問・応用1問)を収録しています。

  • クラスの定義とインスタンス
  • 継承とプライベート変数
  • スコープと名前空間
  • イテレータとジェネレータ

情報源と編集区分

公式範囲を確認し、問題数・難易度・確認点は当サイトが集計・編集。 一次情報確認日: 2026-09-18。

試験概要(公式)

確認しておきたいポイント

当サイトの作問時に観察した、取り違えやすい論点です(公式の統計ではありません)。

  • メソッドの最初の引数 self の扱い。公式チュートリアル9.4は「この名前付けは単なる慣習でしかありません。self という名前は、Python では何ら特殊な意味を持ちません」と述べており、予約語ではない。ただし慣習に従わないと読みにくくなるとも述べている。
  • クラス変数とインスタンス変数の混同。どちらに属する値かで、他のインスタンスへの影響が変わる。
  • 最初の引数を省略できると思い込むこと。インスタンスのメソッドは最初の引数でインスタンス自身を受け取るため省略できない。

よくある質問

Q第9章 クラスは何問収録されていますか?

A

現在7問を収録しています。内訳は基礎1問・標準5問・応用1問です。

Q第9章 クラスの頻出論点は何ですか?

A

クラスの定義とインスタンス・継承とプライベート変数・スコープと名前空間・イテレータとジェネレータなどが出題対象です(当サイト収録問題に基づく編集部集計)。

Q間違えた問題はどう復習すればいいですか?

A

誤答した選択肢のどこがずれていたかを解説で確認し、関連用語がある場合は用語集で定義に戻ってから再演習することをおすすめします。

第1問 ・ クラスの定義とインスタンス

クラスのメソッドの最初の引数について、正しい説明はどれか。

  • ア呼び出したインスタンス自身を受け取る引数で、慣習として self と名付ける
  • イクラス自身を受け取る引数で、名前は cls に固定されている
  • ウ省略できる引数で、書かなくても同じように動く
  • エ戻り値を入れるための引数である
答えと解説を見る
ア呼び出したインスタンス自身を受け取る引数で、慣習として self と名付ける正解
解説

正解は「呼び出したインスタンス自身を受け取る引数で、慣習として self と名付ける」である。インスタンスのメソッドは最初の引数でそのインスタンス自身を受け取り、その名前は慣習として self が使われる。self という名前は言語の予約語ではないが、慣習に従うのが読みやすさの面で望ましい。クラス自身を受け取る形は別の種類のメソッドの話で、名前が固定されているわけでもない。最初の引数を書かずに省略することはできず、戻り値を入れるための引数でもない。

https://docs.python.org/ja/3/tutorial/classes.html (Python公式チュートリアル 第9章 クラス、2026-09-11確認)

問題番号: py3b-020
問題番号 py3b-020 の誤りを報告する
第2問 ・ 継承とプライベート変数

クラス定義の中で __spam のように先頭に2つのアンダースコアを持つ識別子を使ったとき、Pythonが行う処理として正しいものはどれか。

  • ア_クラス名__spam の形式に置き換える名前修飾(マングリング)を行う
  • イ完全に外部からアクセスできない、真にプライベートな変数として扱う
  • ウ先頭のアンダースコアをすべて取り除いた spam という名前に置き換える
  • エ構文エラーになり、クラスの定義自体が失敗する
答えと解説を見る
ア_クラス名__spam の形式に置き換える名前修飾(マングリング)を行う正解
解説

正解は「_クラス名__spam の形式に置き換える名前修飾(マングリング)を行う」である。公式チュートリアルは、先頭に2個以上、末尾に1個以下のアンダースコアを持つ識別子は_classname__spamの形にテキスト置換されると説明しており、classnameは先頭のアンダースコアを取り除いた現在のクラス名である。この仕組みはサブクラスが内部のメソッド呼び出しを壊さずにメソッドをオーバーライドできるようにするためのものであり、Pythonにはオブジェクトの外から一切アクセスできない真にプライベートな変数は存在しない。名前修飾は主に不慮の名前衝突を防ぐためのもので、確信犯的にアクセスすることは依然として可能である。単に先頭のアンダースコアを取り除くだけの処理ではなく、構文エラーにもならない。

https://docs.python.org/ja/3/tutorial/classes.html (Python公式チュートリアル 第9章 クラス、2026-09-15確認)

問題番号: py3b-038
問題番号 py3b-038 の誤りを報告する
第3問 ・ スコープと名前空間

Pythonにおける名前空間とスコープの説明として、正しい組み合わせはどれか。

  • ア名前空間は名前からオブジェクトへの対応付けで、スコープはその名前空間へ直接アクセスできるプログラム上の領域である
  • イ名前空間は名前を直接参照できるプログラム上の領域で、スコープは名前からオブジェクトへの対応付けである
  • ウ名前空間はオブジェクトが保存されるメモリ領域で、スコープはそのオブジェクトが存在する時間である
  • エ名前空間はモジュール名だけを集めた一覧で、スコープはクラス定義の内部だけを指す
答えと解説を見る
ア名前空間は名前からオブジェクトへの対応付けで、スコープはその名前空間へ直接アクセスできるプログラム上の領域である正解
解説

正解は「名前空間は名前からオブジェクトへの対応付けで、スコープはその名前空間へ直接アクセスできるプログラム上の領域である」である。公式チュートリアルは、名前空間を名前からオブジェクトへの対応付け、スコープをある名前空間へ直接アクセスできるPythonプログラムのテキスト上の領域と定義している。ここで直接アクセスとは、名前の前に修飾を付けず参照したとき、その名前空間から名前を探すことをいう。したがって両者は関係するが同じ概念ではなく、定義を入れ替えた説明は誤りである。また、名前空間はオブジェクトを置くメモリ領域そのものではなく、スコープもオブジェクトの寿命を表す語ではない。名前空間をモジュール名だけ、スコープをクラス内部だけに限定する説明も、それぞれの定義を不当に狭めている。

https://docs.python.org/ja/3/tutorial/classes.html (Python公式チュートリアル 第9章 クラス、2026-09-18確認)

問題番号: py3b-039
問題番号 py3b-039 の誤りを報告する
第4問 ・ イテレータとジェネレータ

yield文を含むジェネレータに対してnext()を繰り返し呼んだときの動作として、正しいものはどれか。

  • ア呼び出すたびに関数の先頭から実行し直し、ローカル変数も毎回初期化する
  • イ以前に中断した処理を再開し、ローカル変数と実行状態を呼び出しの間で保持する
  • ウ最初の呼び出しですべての値をリストにまとめ、それ以後は同じリストを返す
  • エ動作させる前に__iter__()と__next__()を利用者が手作業で追加する必要がある
答えと解説を見る
イ以前に中断した処理を再開し、ローカル変数と実行状態を呼び出しの間で保持する正解
解説

正解は「以前に中断した処理を再開し、ローカル変数と実行状態を呼び出しの間で保持する」である。公式チュートリアルは、ジェネレータを通常の関数のように書き、データを返すときにyield文を使うと説明している。next()が呼び出されるたびに、ジェネレータは以前に中断した処理を再開し、すべてのデータ値と最後に実行した文を記憶する。このため、毎回関数の先頭へ戻ってローカル変数を初期化するわけではなく、最初から全結果をリストにまとめて返す動作でもない。また、ジェネレータでは__iter__()と__next__()が自動で作成されるため、利用者がこの2つを手作業で追加する必要はない。処理が終了するとStopIterationも自動的に送出される。

https://docs.python.org/ja/3/tutorial/classes.html (Python公式チュートリアル 第9章 クラス、2026-09-18確認)

問題番号: py3b-040
問題番号 py3b-040 の誤りを報告する
第5問 ・ クラスの定義とインスタンス

class Team: members = [] のように定義し、__init__ では self.name = name だけを行い、メソッド add_member では self.members.append(person) を実行する設計にした。異なる名前で作成した複数のTeamインスタンスでadd_memberを呼んだときに起こることとして、正しいものはどれか。

  • アmembersはインスタンスごとに独立したリストとして扱われ、あるインスタンスで追加した要素は他のインスタンスのmembersに現れない
  • イmembersはクラス変数としてすべてのインスタンスで共有されるため、あるインスタンスのadd_memberで追加した要素が他のインスタンスのmembersにも現れる
  • ウnameもmembersと同様にクラス変数として扱われるため、すべてのインスタンスで同じ名前になる
  • エadd_memberを呼び出すたびに、membersが新しい空リストとして作り直される
答えと解説を見る
イmembersはクラス変数としてすべてのインスタンスで共有されるため、あるインスタンスのadd_memberで追加した要素が他のインスタンスのmembersにも現れる正解
解説

正解は「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確認)

問題番号: py3b-086
問題番号 py3b-086 の誤りを報告する
第6問 ・ クラスの定義とインスタンス

インスタンスx に対する x.f() という呼び出しと、メソッドオブジェクトの仕組みについて、正しい説明はどれか。

  • アx.f()はMyClass.f()と等価であり、xを渡す必要はない
  • イメソッドオブジェクトはインスタンスへの参照だけを持ち、対応する関数オブジェクトへの参照は持たない
  • ウx.f()はMyClass.f(x)と厳密に等価であり、インスタンスの非データ属性が関数オブジェクトとして見つかると、インスタンスと関数への参照がメソッドオブジェクトにパックされる
  • エメソッドオブジェクトはm.__func__でインスタンスを、m.__self__で対応する関数オブジェクトを参照する
答えと解説を見る
ウx.f()はMyClass.f(x)と厳密に等価であり、インスタンスの非データ属性が関数オブジェクトとして見つかると、インスタンスと関数への参照がメソッドオブジェクトにパックされる正解
解説

正解は「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確認)

問題番号: py3b-087
問題番号 py3b-087 の誤りを報告する
第7問 ・ 継承とプライベート変数

class DerivedClassName(Base1, Base2, Base3): のように複数の基底クラスを指定したとき、属性の探索順序について正しい説明はどれか。

  • アBase3から先に探索され、見つからなければBase2、最後にBase1の順に探索される
  • イ3つの基底クラスを同時に探索し、複数の候補が見つかった場合は最後に書かれた基底クラスの属性が優先される
  • ウ多重継承では属性の探索順序が定義されておらず、実行するたびに結果が変わることがある
  • エ深さ優先・左から右の順で探索され、まずBase1とその基底クラスを再帰的に探索し、見つからなければBase2を探索する。ただし同じクラスが継承階層に複数回現れる場合は2度探索しない
答えと解説を見る
エ深さ優先・左から右の順で探索され、まずBase1とその基底クラスを再帰的に探索し、見つからなければBase2を探索する。ただし同じクラスが継承階層に複数回現れる場合は2度探索しない正解
解説

正解は「深さ優先・左から右の順で探索され、まず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確認)

問題番号: py3b-088
問題番号 py3b-088 の誤りを報告する

執筆: ミナト編集部(運営者情報を見る)