Pythonでクラスの継承を行う方法

プログラミング Python

PythonはJavaやC++などのプログラミング言語と同様にクラスを継承することができます。

継承することでオブジェクト指向プログラミングの特徴である

  • カプセル化
  • 差分プログラミング
  • ポリモーフィズム

    を実現することができます。
    カプセル化に関してはJavaやC++のように完全なカプセル化はできないのですが・・・

    Pythonでクラス内にPrivate変数を作成する方法
    Pythonではクラス内に「__(アンダーバー2つ)」を付加した変数を宣言することによって疑似的にPrivate変数を作成することができます。ただしクラス内の「__」付きの変数とインスタンスに直接設定した「__」の付きの変数は別物になるということを意識して使う必要があります。
    スポンサーリンク

    Pythonでクラスの継承を行う方法

    Pythonでは基底クラス(親クラスやベースクラスなどとも呼ばれる)を継承してサブクラス(子クラスなどとも呼ばれる)を作成することができます。

    継承を行うことで基底クラスの機能をそのままサブクラスで利用することもできます。

    Pythonでのクラスの継承

    Pythonでクラスを継承するにはサブクラスの宣言時に継承するベースクラスの名前を指定します。

    class BaseClass( object ):
        def __init__( self ):
            pass
    
    class ChildClass( BaseClass ):
        def __init__( self ):
            pass
    

    上記の例ではChildClassというサブクラスでBaseClassというベースクラスを継承しています。

    Pythonでのメソッドの継承

    Pythonでメソッドを継承するにはサブクラスでは何もする必要はありません。

    そのままベースクラスのメソッドを呼び出します。

    class BaseClass( object ):
        def __init__( self ):
            self.name = 'test'
    
        def getName( self ) :
            return self.name
    
    class ChildClass( BaseClass ):
        def __init__( self ):
            pass
    
    obj = ChildClass()
    print( obj.getName() )
    

    上記のプログラムを実行すると

    test
    

    と表示されます。

    ちなみに「__init()__」は各クラスのコンストラクタで、各メソッドに渡されている「self」はそれぞれのインスタンス自身が渡されてきます。

    Pythonでのインスタンス変数の継承

    Pythonでは各インスタンス内で再利用可能なインスタンス変数を持つことができます。

    class BaseClass( object ):
        def __init__( self, name ):
            self.name = name
    
        def getName( self ) :
            return self.name
    
    class ChildClass( BaseClass ):
        def __init__( self, name ):
            super().__init__( name )
    
    obj = ChildClass( 'My name is ChildClass' )
    print( obj.getName() )
    

    上記のプログラムを実行すると

    My name is ChildClass
    

    と表示されます。
    上記のプログラムの中の「super().__init__( name )」のsuper()は基底クラスを表します。

    Pythonでのポリモーフィズムの実現

    Pythonではベースクラスのメソッドをオーバーライドすることによりポリモーフィズムを実現することができます。

    オブジェクト指向プログラミングにおいてオーバーライド (override) とは、スーパークラスで定義されたメソッドをサブクラスで定義し直し、動作を上書き(変更)することです。
    ポリモーフィズム(英: Polymorphism)とは、プログラミング言語の型システムの性質を表すもので、プログラミング言語の各要素(定数、変数、式、オブジェクト、関数、メソッドなど)についてそれらが複数の型に属することを許すという性質

    以下のプログラムの例では各部署によって異なる「仕事をする(doWork())メソッド」を営業部、経理部、技術部クラスがオーバライドすることでポリモーフィズムを実現しています。

    class Employee( object ):
        def __init__( self, name ):
            self.name = name
            self.post = None
    
        def getName( self ) :
            return self.name
    
        def getPost( self ) :
            return self.post
    
        def setPost( self, post ) :
            self.post = post
    
        def doWork() :
            pass
    
    class Sales( Employee ):
        def __init__( self, name ) :
            super().__init__( name )
            self.setPost( '営業部' )
    
        def doWork( self ) :
            print( self.getPost() + '・' + self.getName() +'の仕事は電話でアポイントを取ることです。' )
    
    class Accounting( Employee ):
        def __init__( self, name ) :
            super().__init__( name )
            self.setPost( '経理部' )
    
        def doWork( self ) :
            print( self.getPost() + '・' + self.getName() +'の仕事は旅費精算を行うことです。' )
    
    class Engineering( Employee ):
        def __init__( self, name ) :
            super().__init__( name )
            self.setPost( '技術部' )
    
        def doWork( self ) :
            print( self.getPost() + '・' + self.getName() +'の仕事はプログラムを作成することです。' )
    
    if __name__ == '__main__' :
    
        obj = Sales( '営業太郎' )
        obj.doWork()
    
        obj = Accounting( '経理次郎' )
        obj.doWork()
    
        obj = Engineering( '技術花子' )
        obj.doWork()
    
    

    上記のプログラムを実行すると

    営業部・営業太郎の仕事は電話でアポイントを取ることです。
    経理部・経理次郎の仕事は旅費精算を行うことです。
    技術部・技術花子の仕事はプログラムを作成することです。
    

    となります。

    まとめ

    PythonではJavaやC++などのオブジェクト指向言語と同様にクラスの継承を行うことで差分プログラミングやポリモーフィズムを実現することができます。

    このことにより効率の良いプログラミングが行えるようになっています。

    以上、Pythonでクラスの継承を行う方法でした。

    タイトルとURLをコピーしました