Q1次のうち、オブジェクト指向の class が解決する問題を最もよく表しているのはどれですか?
Python オブジェクト指向まとめ — クラスで「データと処理」を一体化する
Pythonオブジェクト指向の各記事を横断整理する総まとめ。クラスの基本構造、継承・多重継承・多態、特殊メソッドやwith、カプセル化と型ヒントが互いにどう繋がるかを一望できます。
オブジェクト指向は「データと処理を 1 つにまとめる」考え方
Python 文法 では、if / for / defといった基本文法を学びました。Python オブジェクト指向は、その上でデータ (属性) と処理 (メソッド) を 1 つの class にまとめる書き方です。
手続き的に「変数 + 関数」を別々に持つコードと比べて、データとそれを操作する処理を一体化することで、規模が大きくなっても見通しよく組み立てられるようになります。
クラスの基本構造 — 定義・属性・メソッド
クラスを組み立てるときに押さえる要素は次の 4 つです。
classキーワードで型 (= 設計図) を作る__init__でインスタンス (= 実物) を初期化するselfで個体ごとの状態 (属性) を持たせる- メソッドの種類 (instance / class / static) で振る舞いを使い分ける
「設計図 = class」「実物 = インスタンス」という対応を意識すると、全体が見通せます。
| 分類 | 構文・概念 | 代表的な使いどころ |
|---|---|---|
| 定義 | クラスとインスタンス | データ + 振る舞いを 1 つにまとめ、設計図から複数の実物を作る |
| 初期化 | コンストラクタ __init__ / デストラクタ __del__ | インスタンス生成時に必須属性をセット / 終了時に後片付けを書く |
| 属性 | クラス変数とインスタンス変数 | 全員で共有する値と、個体ごとに持つ値を区別する |
| メソッド | インスタンス / クラス / スタティック | self / cls / 引数なしで責務 (個体操作 / 型操作 / 純粋関数) を切り分ける |
クラスを連携させる — 継承と多態
親クラスを再利用する継承、複数の親を束ねる多重継承、同じインターフェースで異なる挙動を取るポリモーフィズムを組み合わせると、コードの重複を削減しながら柔軟な設計ができます。利用側のコードにif type(...)の分岐が並ぶようになったら、ポリモーフィズムを使いましょう。
| 分類 | 構文・概念 | 代表的な使いどころ |
|---|---|---|
| 継承 | class 子(親) と super() | 親の属性 / メソッドを子クラスで再利用、override で個別調整する |
| 多重継承 | 複数の親と MRO | 複数の親から機能を組み合わせる (mixin パターン)。同名メソッドの優先順位は MRO で決まる |
| 多態性 | ポリモーフィズム | 同じメソッド名で型ごとに振る舞いを変え、利用側のif type(...)分岐を消す |
Python らしいクラス設計 — 特殊メソッド・with・型ヒント
Python の class は__メソッド名__ という特殊メソッドを実装することで、+演算子やprint() / with文といった言語の組み込み機能と直接つなぐことができます。さらにカプセル化の慣習 (_x / __x / @property)や型ヒントを組み合わせると、保守性と可読性が大きく上がります。
| 分類 | 構文・概念 | 代表的な使いどころ |
|---|---|---|
| 特殊メソッド | __add__ / __str__ / __eq__ など | +演算子 / print / ==の挙動をクラスに教え、Python 文法と統合する |
| カプセル化 | _x と __x、@property / @setter | 外から触れる属性を絞り、setter でバリデーションを挟む |
| コンテキスト | with と __enter__ / __exit__ | リソース (ファイル / DB / ロック) を確実に取得・解放する仕組みをクラスに組み込む |
| with の応用 | ファイル入出力 with open() | with の代表例。close 忘れや例外時の取りこぼしを防ぐ |
| 型ヒント | : int -> str の表記 | 引数 / 戻り値 / 属性の型を明示し、IDE / mypy で静的チェックを得る |
ここから先 — 実プロジェクトへ
次は複数ファイル / 複数モジュールで組み立てる実プロジェクト構築や、便利なライブラリの利用方法を学びましょう。
理解度チェック
まずは1問ずつ答えてみましょう。
Q2ポリモーフィズムが解決する典型的な問題はどれですか?
Q3独自クラスをwith my_obj:のようにwith 文で使えるようにしたいとき、実装するべきメソッドはどれですか?