【Python】クラス拡張(基底クラス・派生クラス)

【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 を使うと特定の機能を簡単に追加できる

これらを活用すると、柔軟で再利用性の高いコードを作成できます。

コメントは受け付けていません。