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モジュールを使って抽象クラス、抽象メソッドを作成するでした。