PythonではJavaやC++のようなほかのプログラミング言語のように、言語的に抽象メソッド(Abstract Method)を作成することができません。
でもabcモジュールを利用すればPythonでも抽象メソッド(Abstract Method)を作成することができます。
Pythonで抽象メソッド(Abstract Method)を作成する
Pythonで抽象メソッド(Abstract Method)を作成するにはabcモジュールを使用すればできます。
基底クラスではメソッドのインターフェースのみ規定し、その実装はサブクラスに任せる手法。
abcモジュールの使い方
実際にPythonで抽象メソッド(Abstract Method)を作成するにはabcモジュールをImportし、抽象メソッド(Abstract Method)ををもつクラスで@abstractmethodデコレーターを使用して指定します。
from abc import ABCMeta, abstractmethod
class ParentClass( metaclass=ABCMeta ):
def __init__( self ):
pass
################################################
#子クラスで実装をする抽象メソッド(Abstract Method)
#(実体は子クラスで定義しないとエラーになる)
################################################
@abstractmethod
def child_func( self ) :
pass
抽象(Abstract Method)メソッドを持つ基底クラス「ParentClass」には「metaclass=ABCMeta」でメタクラスであることを宣言し、抽象(Abstract Method)メソッド「child_func」には@abstractmethodデコレーターを設定してます。
この状態で「ParentClass」を継承したサブクラス「ChildClass」を宣言し実行すると
from abc import ABCMeta, abstractmethod
class ParentClass( metaclass=ABCMeta ):
def __init__( self ):
pass
################################################
#子クラスで実装をする抽象メソッド(Abstract Method)
#(実体は子クラスで定義しないとエラーになる)
################################################
@abstractmethod
def child_func( self ) :
pass
class ChildClass( ParentClass ):
def __init__( self ):
pass
obj = ChildClass()
Traceback (most recent call last):
File "abcerror.py", line 19, in <module>
obj = ChildClass()
TypeError: Can't instantiate abstract class ChildClass with abstract methods child_func
とエラーになります。
これは基底クラスの抽象メソッド(Abstract Method)をサブクラスでオーバーライドしていないためです。
上記のソースにきちんどサブクラスで抽象メソッド(Abstract Method)を宣言し実装すると
from abc import ABCMeta, abstractmethod
class ParentClass( metaclass=ABCMeta ):
def __init__( self ):
pass
################################################
#子クラスで実装をするabstract抽象(Abstract Method)メソッドメソッド
#(実体は子クラスで定義しないとエラーになる)
################################################
@abstractmethod
def child_func( self ) :
pass
class ChildClass( ParentClass ):
def __init__( self ):
pass
def child_func( self ) :
print( 'ここはサブクラスでのabstractmethodです。' )
obj = ChildClass()
obj.child_func()
ここはサブクラスでのabstractmethodです。
とコンパイルが正常に完了し、サブクラスの「child_func()」がコールされています。
まとめ
Python自体にはJavaやC++などの他のオブジェクト指向言語にある「抽象メソッド(Abstract Method)」という言語仕様はありませんが、abcモジュールを利用することで「抽象メソッド(Abstract Method)」を作成することが可能です。
以上、Pythonでabcモジュールを使って抽象クラス、抽象メソッドを作成するでした。
