Python入門【クラスの継承】

Pythonクラスの継承

こんにちは、ミナトです。

Pythonでは、既存のクラスの機能を引き継いだまま、新しい機能を追加したり、変更して新しいクラスを作成することができます。

このようなクラスの作成方法をクラスの継承といいます。

今回はPythonでのクラスの継承について、プログラミング初心者にも分かりやすく解説します。

今回はクラスの継承について解説するな😆
クラスの継承を利用すれば、既存のクラスの機能を引き継いだまま、新たなクラスを定義できるで!
以下のような方を対象としています
  • Pythonでのクラスの継承について知りたい
  • Pythonでプログラミングを学びたい

クラスの継承

クラスの継承とは

クラスの継承とは、あるクラスをベースとして、そのメソッドや変数を引き継いだまま、新たなクラスを定義する方法です。

ベースとなる親のクラスをスーパークラス、スーパークラスを継承した子クラスをサブクラスといいます。

それでは、クラスの継承について、実際にプログラミングを行いながら確認していきます。

クラスの継承

class サブクラス名(スーパクラス名):
 クラス内の処理

以下の例では、Carクラスを継承したToyotaCarクラスを定義しています。

ToyotaCarクラスでは、コンストラクタやメソッドを定義していませんが、スーパクラスのコンストラクタやdrive()メソッドがそのまま利用できます。

class Car:
    def __init__(self, name, speed=60):
        self.name = name
        self.speed = speed

    def drive(self):
        print(f'{self.name}が時速{self.speed}kmで走行します。')


class ToyotaCar(Car):
    pass


car1 = ToyotaCar('ハリアー', 80)
car1.drive()


## 出力
ハリアーが時速80kmで走行します。

上の例では、サブクラスでは何も定義しませんでしたが、通常はサブクラスで新たな変数やメソッドを追加して利用することになります。

以下の例では、Carクラスを継承したTeslaCarクラスを定義しています。

TeslaCarクラスでは、スーパークラスのdrive()メソッドも実行でき、新たに定義したauto_drive()メソッドも実行可能であることが確認できます。

class Car:
    def __init__(self, name, speed=60):
        self.name = name
        self.speed = speed

    def drive(self):
        print(f'{self.name}が時速{self.speed}kmで走行します。')


class TeslaCar(Car):
    def auto_drive(self):
        print(f'{self.name}が時速{self.speed}kmで自動運転モードで走行します。')


car1 = TeslaCar('Model S', 80)
car1.drive()
car1.auto_drive()

## 出力
Model Sが時速80kmで走行します。
Model Sが時速80kmで自動運転モードで走行します。

メソッドのオーバーライド

先程の例では、クラスを継承し、サブクラスに新たなメソッド追加しました。

しかし、スーパクラスで定義されている機能を上書きしたいというケースもあります。その様な場合は、メソッドのオーバーライドを行うことで、スーパクラスの処理を上書きできます。

以下の例では、CarクラスのサブクラスFerrariCarクラスを定義しています。FerrariCarクラスではCarクラスのdrive()メソッドをオーバーライドしています。

class Car:
    def __init__(self, name, speed=60):
        self.name = name
        self.speed = speed

    def drive(self):
        print(f'{self.name}が時速{self.speed}kmで走行します。')


class FerrariCar(Car):
    def drive(self):
        print(f'レーシングモードで時速{self.speed * 2}kmで走行します。')


car1 = FerrariCar('Model S', 100)
car1.drive()


## 出力
レーシングモードで時速200kmで走行します。

コンストラクタのオーバーライド

通常のメソッドだけではなく、コンストラクのような特殊メソッドもオーバーライドできます。

以下の例では、FerrariCarクラスでコンストラクタ__init__()をオーバーライドして、mode変数の初期化処理を追加しています。

また、Pythonではsuper()という関数を利用することで、スーパークラスの処理を呼び出すことができます。

super().init(name, speed)では、スーパークラスCarクラスの__init__()を呼び出しています。

このようにsuper()を利用すると、クラスの継承を行うたびにスーパークラスで定義している共通する処理をわざわざ再度記述する必要がないため、効率的に開発を行えるようになります。

class FerrariCar(Car):
    def __init__(self, name, speed=100, mode='SPORT'):
        super().__init__(name, speed)
        self.mode = mode


car1 = FerrariCar('Model S', 100, 'RACE')
print(car1.name, car1.speed, car1.mode)


## 出力
Model S 100 RACE

多重継承

Pythonでは、多重継承を行うことができます。

多重継承は文字通り、複数のクラスを継承することです。サブクラスでは、複数のスーパークラスの特徴を受け継ぐことができます。

以下の例では、RobotクラスとAirPlaneクラスを継承したHyperRobotクラスを定義しています。

HyperRobotクラスは二つのスーパクラスが持っている機能を両方とも受け継いでいるため、attack()メソッドとfly()メソッドの両方を利用できます。

class Robot():
    def attack(self):
        print('ビームを打ちます')


class AirPlane():
    def fly(self):
        print('空を飛びます')


class HyperRobot(Robot, AirPlane):
    pass


robot1 = HyperRobot()
robot1.attack()
robot1.fly()


## 出力
ビームを打ちます
空を飛びます

まとめ

今回はクラスの継承について解説しました。

クラス継承は既存のクラスの機能を引き継いだまま、新しい機能を追加したり、変更して新しいクラスを定義する方法です。

クラスの継承を利用することで、効率的に開発が行えるため、実際の開発でも頻繁に利用します。

クラスの継承の使い方については、しっかり覚えておきましょう。

最後まで読んでいただき、ありがとうございます。

この記事が、「面白いな」、「勉強になったな」という方は、SNSでシェアしていただけると嬉しいです。