【Python】クラス拡張(基底クラス・派生クラス)
目次
クラスの拡張とは?
クラスの拡張とは、既存のクラスを基に新しいクラスを作成し、追加の機能を持たせたり、動作を変更したりする手法です。これを「継承」と呼びます。
Pythonでは、あるクラスを基底クラス(親クラス)として、その機能を引き継ぐ派生クラス(子クラス)を作ることができます。
基底クラスの定義
基底クラス(親クラス)は他のクラスに継承されるためのクラスです。基本的なメソッドを定義できます。
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return "何か音を出す"
このクラスを継承して新しいクラスを作ることができます。
派生クラスの作成
派生クラス(子クラス)は、基底クラスの機能を引き継ぎながら、新たな機能を追加できます。
class Dog(Animal):
def speak(self):
return "ワンワン"
class Cat(Animal):
def speak(self):
return "ニャー"
このように、`Dog` クラスと `Cat` クラスは `Animal` クラスを継承し、それぞれの `speak` メソッドを定義しています。
メソッドのオーバーライド
派生クラスでは、基底クラスのメソッドを上書き(オーバーライド)できます。
dog = Dog("ポチ")
cat = Cat("タマ")
print(dog.speak()) # 出力: ワンワン
print(cat.speak()) # 出力: ニャー
基底クラスの `speak()` メソッドは「何か音を出す」としていましたが、派生クラスでオーバーライドすることで、それぞれの動物の鳴き声を返すようになりました。
super() を使った基底クラスの呼び出し
基底クラスのメソッドを派生クラスから呼び出す場合は `super()` を使います。
class Bird(Animal):
def __init__(self, name, can_fly):
super().__init__(name)
self.can_fly = can_fly
def speak(self):
return "チュンチュン"
`super().__init__(name)` により、基底クラスの `__init__` メソッドを呼び出しています。
多重継承
Python では、一つのクラスが複数の基底クラスを持つことができます。
class Swimmer:
def swim(self):
return "泳げる"
class Flyer:
def fly(self):
return "飛べる"
class Duck(Swimmer, Flyer):
pass
duck = Duck()
print(duck.swim()) # 出力: 泳げる
print(duck.fly()) # 出力: 飛べる
このように、`Duck` クラスは `Swimmer` と `Flyer` を継承しており、両方のメソッドを使用できます。
抽象クラス
抽象クラスとは、直接インスタンス化できないクラスで、派生クラスにメソッドの実装を強制できます。
from abc import ABC, abstractmethod
class AbstractAnimal(ABC):
@abstractmethod
def speak(self):
pass
class Dog(AbstractAnimal):
def speak(self):
return "ワンワン"
# animal = AbstractAnimal() # これはエラーになる
dog = Dog()
print(dog.speak()) # 出力: ワンワン
Mixin クラスの活用
Mixin クラスは、特定の機能だけを提供するクラスです。
class LoggerMixin:
def log(self, message):
print(f"ログ: {message}")
class Application(LoggerMixin):
def run(self):
self.log("アプリケーションを実行中")
app = Application()
app.run()
この `LoggerMixin` はログ機能だけを提供し、`Application` クラスで利用されています。
まとめ
Python のクラスの拡張と継承について、基本的な使い方から応用まで解説しました。
- 基底クラスは共通の機能を定義する
- 派生クラスで機能を拡張・オーバーライドできる
- super() を使って基底クラスのメソッドを呼び出せる
- 多重継承や抽象クラスを活用できる
- Mixin を使うと特定の機能を簡単に追加できる
これらを活用すると、柔軟で再利用性の高いコードを作成できます。