順番に読み進めながら学べます

Python オブジェクト指向の総まとめ問題 — 学んだことをコードで確認

Pythonオブジェクト指向の章末まとめ問題4問。Pointの特殊メソッド、SavingsAccountのsuper()、Celsiusの @propertyバリデーション、図形のarea()ポリモーフィズムをコードで解く演習です。

問題 1: 特殊メソッドで Point クラスを設計する

2 次元の座標を表すPointクラスを作ります。__init__で属性を初期化し、__add__+演算子の挙動を定義し、__str__print()したときの表示を整える、特殊メソッドの組み合わせ問題です。

解説:3 つの特殊メソッドが順に動く流れ
Point(1, 2)__init__: self.x=1, self.y=2p1 + p2__add__: Point(4, 6) を返すprint(p1 + p2)__str__: "(4, 6)"+print
__init__で属性をセット → __add__で新しいインスタンスを返す → __str__で文字列化の順に呼び出される。

x 座標と y 座標を持つPointクラスを作ってください。

Point(1, 2) + Point(3, 4)print()したときに、画面に(4, 6)と表示されるように設計してください。

Python エディタ

コードを実行してください

問題 2: 継承と super() で銀行口座を拡張する

親クラスBankAccountを継承して、利子計算ができるSavingsAccountを作ります。super().__init__(...)親クラスの初期化処理を呼び出してから子クラス独自の属性を追加する、継承の典型パターンです。

解説:super() で親の __init__ を呼んでから自分の属性を追加
BankAccount(親)name / balanceSavingsAccount(子)name / balance / rate__init__self.name, self.balance__init__super().__init__(...)self.rate を追加apply_interest()balance += balance * rate継承super 呼び出し拡張
子の__init__の中でsuper().__init__(...)を呼ぶことで、親が用意してくれる初期化処理をそのまま使い、そのあとに子だけの属性を増やす。

親クラスBankAccountを継承したSavingsAccountクラスを作ってください。SavingsAccountは親のnamebalanceに加えて、利率rateを持ちます。

さらにapply_interest()メソッドで、現在の残高に利子(残高 × 利率、整数化)を加算してください。SavingsAccount("Alice", 100000, 0.05)を作ってapply_interest()を呼んだあと、print()Alice: 105000と表示されるように設計してください。

Python エディタ

コードを実行してください

問題 3: @property で温度の範囲を保証する

温度を表すCelsiusクラスを作ります。属性valueへの代入時に絶対零度(-273.15)より低い値を弾くバリデーションを@property@value.setterで実装する、カプセル化の典型パターンです。

解説:setter で代入を必ずバリデーションする
Celsius(25)self.value = 25 → settert.value = -300再代入 → setter25 >= -273.15バリデーション成功-300 < -273.15バリデーション失敗self._value = 25属性に保存raise ValueError例外を発生
t.value = X直接代入のように見えても、内部では setter が呼ばれて検証が走る。範囲外ならValueError、範囲内なら_valueにセット。

温度を表すCelsiusクラスを作ってください。属性value-273.15未満の値を代入しようとしたらValueError("絶対零度より低い温度は設定できません")を発生させるようにします。

Celsius(25)を作って温度を表示したあと、t.value = -300の代入をtry / exceptで囲み、エラーメッセージをエラー: ...の形で表示してください。

Python エディタ

コードを実行してください

問題 4: ポリモーフィズムで図形の面積を一括処理する

形の違う 2 種類のクラスに同じ名前のメソッドarea()を持たせ、リストにまとめてforで一括処理します。呼び出し側はクラスの違いを意識せず、同じ書き方で異なる実装を動かせるのがポリモーフィズムです。

解説:同じメソッド名で型ごとに違う動き
Rectanglewidth × heightshapes リスト[Rectangle, Circle]Circleπ × radius²Rectangle.area()= w × hfor shape in shapes:shape.area()Circle.area()= π × r²forRectangle ならCircle なら
リスト内の各要素でshape.area()を呼ぶと、実際の型に応じたメソッドが自動的に選ばれて実行される。

Rectangle(width, height)Circle(radius)の 2 つのクラスを作り、どちらもarea()メソッドで面積を返すようにしてください。Rectangleは 幅 × 高さCircleは π × 半径の 2 乗で計算します。

Rectangle(3, 4)Circle(5)をリストにまとめてforで回し、各要素の面積を面積: 12.00のように小数点 2 桁で出力してください。円周率はmath.piを使います。

Python エディタ

コードを実行してください

ここまでお疲れ様でした

Python オブジェクト指向の章はこれで完了です。クラスとインスタンスの設計、__init__ / __add__ / __str__などの特殊メソッド、継承とsuper()、@propertyによるカプセル化、ポリモーフィズム、with文と型ヒントまで、データと処理を 1 つの型としてまとめる設計の道具がひととおり揃いました。これで、ご自身で型を定義して、そこにメソッドを生やし、複数の型を共通のインターフェースで扱えるようになりました。

次の章「Python 応用」では、モジュール / パッケージで複数ファイルを束ねる構成、datetime / os / re / json / collections / dataclasses / asyncioなどの標準ライブラリを使って、実務で出会う具体的な処理を組み立てる方法を学びます。