1. ホーム
  2. パイソン

[解決済み】Pythonで抽象クラスを作ることは可能か?

2022-04-18 07:14:48

質問

Pythonでクラスやメソッドを抽象化するにはどうしたらいいですか?

を再定義してみました。 __new__() というように

class F:
    def __new__(cls):
        raise Exception("Unable to create an instance of abstract class %s" %cls)

を作成しましたが、今度はクラス G を継承している F というように

class G(F):
    pass

をインスタンス化することができません。 G というのも、このクラスはスーパークラスの __new__ メソッドを使用します。

抽象クラスを定義する良い方法はないでしょうか?

どのように解決するのですか?

を使用します。 abc モジュールで抽象クラスを作成します。を使用します。 abstractmethod メソッドの抽象化を宣言するデコレーターと、クラスの抽象化を宣言するデコレーターは、Pythonのバージョンに応じて3つの方法のうちの1つを使用します。

Python 3.4以降では、以下のような継承が可能です。 ABC . 以前のバージョンの Python では、クラスのメタクラスは ABCMeta . メタクラスの指定は、Python 3とPython 2で構文が異なります。3つの可能性を以下に示します。

# Python 3.4+
from abc import ABC, abstractmethod
class Abstract(ABC):
    @abstractmethod
    def foo(self):
        pass

# Python 3.0+
from abc import ABCMeta, abstractmethod
class Abstract(metaclass=ABCMeta):
    @abstractmethod
    def foo(self):
        pass

# Python 2
from abc import ABCMeta, abstractmethod
class Abstract:
    __metaclass__ = ABCMeta

    @abstractmethod
    def foo(self):
        pass

どの方法を使っても、抽象的なメソッドを持つ抽象クラスをインスタンス化することはできませんが、それらのメソッドの具体的な定義を提供するサブクラスをインスタンス化することは可能です。

>>> Abstract()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Abstract with abstract methods foo
>>> class StillAbstract(Abstract):
...     pass
... 
>>> StillAbstract()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class StillAbstract with abstract methods foo
>>> class Concrete(Abstract):
...     def foo(self):
...         print('Hello, World')
... 
>>> Concrete()
<__main__.Concrete object at 0x7fc935d28898>