PythonはJavaやC++などのプログラミング言語と同様にクラスを継承することができます。
継承することでオブジェクト指向プログラミングの特徴である
- カプセル化
- 差分プログラミング
- ポリモーフィズム
を実現することができます。
カプセル化に関してはJavaやC++のように完全なカプセル化はできないのですが・・・
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ではベースクラスのメソッドをオーバーライドすることによりポリモーフィズムを実現することができます。
以下のプログラムの例では各部署によって異なる「仕事をする(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でクラスの継承を行う方法でした。