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 文で使えるようにしたい とき、実装するべきメソッドはどれですか?