PythonでABCMetaモジュールを使って抽象メソッドを作成する

記事内に広告が含まれています。

PythonではJavaやC++のようなほかのプログラミング言語のように、言語的に抽象メソッド(Abstract Method)を作成することができません。

でもabcモジュールを利用すればPythonでも抽象メソッド(Abstract Method)を作成することができます。

Pythonで抽象メソッド(Abstract Method)を作成する

Pythonで抽象メソッド(Abstract Method)を作成するにはabcモジュールを使用すればできます。

抽象(Abstract Method)メソッドとは、基底クラス(ベースクラスや親クラスともいう)が持つメソッドをサブクラス(子クラス)に対してオーバーライドを強制するメソッドのこと。
基底クラスではメソッドのインターフェースのみ規定し、その実装はサブクラスに任せる手法。

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

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