機能追加をする場合の3パターンについて考える。
1.新しいクラスおよび関数の作成
適用例
① ゼロベースで新しい機能を作りたい場合に適用する。
具体例
新しい人間クラスや関数を作る場合
example.py
# 人間を表す新しいクラスを作成
class Human:
# コンストラクタで名前と年齢を初期化
def __init__(self, name, age):
self.name = name # インスタンス変数 self.name に名前を格納
self.age = age # インスタンス変数 self.age に年齢を格納
# 人間が話す振る舞いを定義するメソッド
def speak(self):
return f"{self.name}が話しています。" # メソッドが呼ばれると名前付きのメッセージを返す
# 人間の挨拶をする関数を作成
def greet(human):
# 関数の引数に Human クラスのインスタンスを渡し、挨拶の文字列を返す
return f"こんにちは、{human.name}さん!"
# Humanクラスのインスタンスを生成
person = Human("田中", 36)
# speakメソッドを呼び出して話す
print(person.speak()) # 出力: "田中が話しています。"
# greet関数で挨拶を表示
print(greet(person)) # 出力: "こんにちは、田中さん!"
2.デコレータ
適用例
① 既存のコードを変更せず、特定の振る舞いを追加したいとき。
② 簡単な処理や複数のクラス関数に共通するロジックを適用したいとき。
具体例
趣味を追加するデコレータ
example.py
# 趣味を追加するためのデコレータを定義
def add_hobby(hobby):
# デコレータ自体がクラスを引数に取る内包関数を返す
def decorator(cls):
# クラスに新しい属性 hobby を追加
cls.hobby = hobby
# クラスに新しいメソッド hobby_introduction を追加
cls.hobby_introduction = lambda self: f"趣味:{self.hobby}"
return cls # 修飾されたクラスを返す
return decorator
# Humanクラスにデコレータを適用し、趣味を「読書」と設定
@add_hobby("読書")
class Human:
# Humanクラスのコンストラクタ
def __init__(self, name, age):
self.name = name # インスタンス変数 self.name に名前を格納
self.age = age # インスタンス変数 self.age に年齢を格納
# 人間が話す振る舞いを定義
def speak(self):
return f"{self.name}が話しています。"
# Humanクラスのインスタンスを生成
person = Human("田中", 36)
# speakメソッドを呼び出して話す
print(person.speak()) # 出力: "田中が話しています。"
# デコレータで追加された趣味を紹介するメソッドを呼び出す
print(person.hobby_introduction()) # 出力: "趣味:読書"
3.クラス継承
適用例
① 親クラスの機能を活かしつつ、拡張や変更をしたいとき。
② 同じような構造を持つ複数のクラスを作るとき。
具体例
「人間」クラスを継承して「ロボット人間」を作る場合。
example.py
# 人間を表す親クラス
class Human:
# コンストラクタで名前と年齢を初期化
def __init__(self, name, age):
self.name = name # インスタンス変数 self.name に名前を格納
self.age = age # インスタンス変数 self.age に年齢を格納
# 人間が話す振る舞いを定義するメソッド
def speak(self):
return f"{self.name}が話しています。" # メソッドが呼ばれると名前付きのメッセージを返す
# Humanクラスを継承したアンドロイドクラスを作成
class Android(Human):
# コンストラクタで名前、年齢に加えてモデル番号を初期化
def __init__(self, name, age, model):
# super()を使って親クラスのコンストラクタを呼び出す
super().__init__(name, age)
self.model = model # インスタンス変数 self.model にモデル番号を格納
# 親クラスの speak メソッドをオーバーライド(上書き)
def speak(self):
# オーバーライドしたメソッドでは「アンドロイド」専用のメッセージを返す
return f"私はアンドロイド {self.model} です。"
# Humanクラスのインスタンスを生成
person = Human("田中", 36)
# Humanクラスのメソッドを使用
print(person.speak()) # 出力: "田中が話しています。"
# Androidクラスのインスタンスを生成
robot = Android("田中", 36, "RX-78")
# オーバーライドした speak メソッドを使用
print(robot.speak()) # 出力: "私はアンドロイド RX-78 です。"
4.使い分けのポイント
① 新しいクラス/関数
完全に独立した機能やロジックが必要な場合に使います。
他のクラスや関数に依存しないため、自由度が高い。
② デコレータ
既存のコードを変更せずに、部分的な機能を追加したい場合に使用。
特定の振る舞いを柔軟に再利用可能。
③ クラス継承
基本形があり、それを元に少しずつ違うものを作りたい場合に使用。
親クラスの共通部分を活用して、効率的にコードを再利用可能。
5.選ぶ基準
① 完全に新しいロジックが必要なら、新しいクラスや関数を作成。
② 柔軟に部分的な拡張がしたいなら、デコレータを使用。
③ 共通機能をベースに派生クラスを作りたいなら、クラス継承を使用。