Python - クラス - 継承

公開日:2019-03-04

1. 概要

クラスの継承の方法です。
クラスを継承するには、「class クラス名(親クラス名)」とします。
クラスを継承すると、親クラスのメソッドは、子クラスでも使用することができます。

2.1 サンプル

ソース
class Test:
  
    def test(self):
        print("親クラスのメソッド")
    
class TestEx(Test):
    pass
    
obj = Test()
obj.test()

objEx = TestEx()
objEx.test()

実行結果
親クラスのメソッド
親クラスのメソッド

2.2 オーバーライド

継承して親クラスのメソッドを上書き(オーバーライド)することができます。
また、子クラスから上書き前のメソッドを呼びたい場合は、super() を付けると呼ぶことができます。

ソース
class Test:

    def test(self):
        print("親クラスのメソッド")
    
class TestEx(Test):
    
    def test(self):
        super().test()
        print("子クラスのメソッド")
    
objEx = TestEx()
objEx.test()

実行結果
親クラスのメソッド
子クラスのメソッド

2.3 抽象メソッド

抽象メソッドは、子クラスにメソッドの実装を強制するものです。
メソッドが実装されていない場合は、インスタンス生成時にエラーとなります。

抽象メソッドにするには、クラスに「(metaclass=ABCMeta)」を付けます。
次に、抽象メソッドにしたいメソッドに @abstractmethod を付けると、抽象メソッドになります。

ソース
from abc import ABCMeta, abstractmethod

class Test(metaclass=ABCMeta):
    
    def test(self):
        self.abstract_test()
        
    @abstractmethod
    def abstract_test(self):
        print("親クラスのメソッド")
        pass
    
class TestEx(Test):

    def abstract_test(self):
        print("抽象メソッド")
    
objEx = TestEx()
objEx.test()

実行結果
抽象メソッド

2.4 親クラスから子クラスのメソッドの実行

Python では、定義時点で存在しないメソッドを使用しても、エラーになりません。
実際に実行してみて、メソッドがなかった場合にエラーとなります。

以下の例では、親クラスに存在しないメソッドを呼んでいますが、
子クラスでそのメソッドを実装することにより、実行時には問題なく動作しています。

ソース
class Test:
    def test(self):
        self.abstract_test()

class TestEx(Test):
    def abstract_test(self):
        print("抽象メソッド")

objEx = TestEx()
objEx.test()

実行結果
抽象メソッド