クラスとインスタンス
クラスはオブジェクトの設計図であり、インスタンスはその設計図から生成される実体です。
__init__ メソッドがインスタンスの初期化を行い、インスタンス属性は各オブジェクト固有の状態を保持します。
クラス属性はクラス全体で共有される値として定義されます。
設計の際は責務を小さく保ち、過度な結合を避けることが重要です。
# クラスの基本例 class Player: def __init__(self, name, hp=100): self.name = name self.hp = hp def attack(self, target): print(f"{self.name} attacks {target.name}")
継承とポリモーフィズム
継承により既存のクラスを拡張し、共通のインターフェースで異なる振る舞いを扱うことができます。
ポリモーフィズムは異なるクラスが同じメソッド名で振る舞いを変えることを指し、テストや設計上の柔軟性に寄与します。
ただし深い継承階層は複雑さを招くため、まずはコンポジションでの設計を検討してください。
# 継承の例 class Character: def speak(self): print("...") class Hero(Character): def speak(self): print("I will save the world!")
特殊メソッドと表現
__str__ や __repr__ を実装するとデバッグ時の表示が改善されます。
__eq__ を定義すればオブジェクト同士の比較を明確にできます。
特殊メソッドは言語組み込みの振る舞いと統合するための重要な手段です。
# 特殊メソッドの例 class Point: def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return f"Point({self.x}, {self.y})"
プロパティとアクセス制御
@property デコレータを使うと属性アクセスに処理を挟め、外部API を壊さずに内部実装を変更できます。
名前先頭のアンダースコアは「非公開」の慣習であり、厳密なアクセス制御ではないことに注意してください。
# プロパティの例 class Character: def __init__(self, name): self._name = name @property def name(self): return self._name
データクラスとユーティリティ
dataclasses を用いるとデータ保持用のクラスを簡潔に定義できます。
等価比較や repr の自動生成、イミュータブル化など有用な機能を簡単に利用できます。
ゲーム開発のエンティティ定義や設定データに向いています。
# dataclass の例 from dataclasses import dataclass @dataclass class Item: name: str value: int
設計のヒント(実務的)
単一責任の原則に従いクラスの責務を小さく保つこと、継承よりコンポジションを優先すること、そしてインターフェースを明確にしてテストしやすい設計にすることが重要です。
これらは大規模開発やチーム作業での保守性を大きく改善します。
概念 | 要点 |
---|---|
クラス | 状態と振る舞いをまとめる単位。 |
継承 | 再利用と振る舞いの拡張に用いるが乱用に注意。 |