Pythonでクラスを継承する

既存にあるクラスの内容を引き継いで、新規にクラスを定義することを継承と呼びます。この機能のため、似た機能を持つクラスを新しく作成する必要がある場合、プログラムの作成や修正を簡略化できるというメリットがあります。今回は、クラスの継承方法とメソッドのオーバーライドの方法を説明します。

継承とは

クラスの継承とは、既存のクラスの機能を引き継いで、新規にクラスを実装する手法です。継承の元になるクラスをスーパークラス、継承して新しく作成するクラスをサブクラスと呼びます。

たとえば、自動車という Car クラスがあるとします。自動車はタイヤの本数や重量などの情報(データ)をもち、走るといった機能(メソッド)を共通にもちます。もし新しい自動車を開発するとき、走るという機能をいちから作るとなると非常に労力がかかります。Car というクラスを継承した新しいクラスを作ることで、走るという機能を作ることなく再利用ことが可能になるのです。さらに、その走るという機能を加工したり、飛ぶという機能を追加したりすることもできます。

クラス継承の方法

まず、クラス継承の説明の前に、サンプルとして簡単なクラスを以下に定義します。

class Calc:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def add(self):
        return self.x + self.y

if __name__ == "__main__":
    c = Calc(1, 2)           # NewCalc クラスのインスタンスを生成
    print c.add()            # 3
    print c.sub()            # -1

上記で定義した Calc クラスには、x, y というインスタンス変数と加算を行う add()メソッドを定義しています。

ここで、Calc クラスを継承して、新しく減算の機能 sub() メソッドを追加した NewClac クラスを定義してみましょう。

class Calc:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def add(self):
        return self.x + self.y

class NewCalc(Calc):             # Calc クラスを継承してサブクラスを定義
    def sub(self):               # 新しいメソッドを追加
        return self.x - self.y

if __name__ == "__main__":
    nc = NewCalc(1, 2)           # NewCalc クラスのインスタンスを生成
    print nc.add()               # 3
    print nc.sub()               # -1

上のプログラムでは、Calc クラスと Calc クラスを継承した NewCalc クラスを新しく定義しています。

クラスの継承はクラス名を宣言するときに、以下のようにクラス名の後に引数としてスーパークラスを指定します。Python では複数のクラスを継承することができます

class クラス名(スーパークラス1, スーパークラス2, [, スーパークラスn]):

上の例では、class NewClac(Calc): という部分でクラスを継承しています。これにより、 NewCalc クラス内では定義していない x, y の変数と __init__() や add() といったメソッドも NewClac のインスタンスで使用できるようになっています。クラスを継承して拡張することにより、より機能性をもったクラスを簡単に作ることができました。

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

Python ではメソッドのオーバーライドという機能があり、スーパークラスのメソッドをサブクラスで上書きすることができます。

class Calc:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def add(self):
        return self.x + self.y

class NewCalc(Calc):             # Calc クラスを継承してサブクラスを定義
    def add(self):               # add メソッドをオーバーライド
        print self.x + self.y

    def sub(self):
        print self.x - self.y

if __name__ == "__main__":
    nc = NewCalc(1, 2)           # NewCalc クラスのインスタンスを生成
    nc.add()                     # 3
    nc.sub()                     # -1

新たにメソッドをオーバーライドする場合は、スーパークラスと同名のメソッドをサブクラスで定義するだけです。例では add() メソッドの計算結果を表示するようメソッドを改変し、サブクラスでオーバーライドしています。これにより、サブクラスの定義が優先され、サブクラスのメソッドが実行されるようになります。既存の機能を変更する必要がある場合は、オーバーライドを行うことによって実現することができます。

まとめ

今回は、クラスの継承とオーバーライドについて説明しました。クラスの継承はオブジェクト指向を実現する上で必要不可欠な機能です。きちんと理解しておきましょう。