1. ホーム
  2. python

[解決済み] Pythonにおける抽象クラスとインターフェースの違い

2022-03-17 02:28:24

質問

Pythonの抽象クラスとインターフェースの違いは何ですか?

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

時々見かけるのは、以下のようなものです。

class Abstract1:
    """Some description that tells you it's abstract,
    often listing the methods you're expected to supply."""

    def aMethod(self):
        raise NotImplementedError("Should have implemented this")

Pythonには正式なInterfaceの契約がない(そして必要ない)ので、Javaスタイルの抽象化とInterfaceの区別は存在しません。 もし誰かが正式なインターフェースを定義する努力を惜しまなければ、それは抽象クラスにもなります。 唯一の違いは、docstringに記載された意図の違いだけでしょう。

それに、アブストラクトとインターフェイスの違いは、ダックタイピングがあると毛嫌いされるんです。

Javaは多重継承ができないからインターフェイスを使う。

Pythonは多重継承なので、以下のようなものもあります。

class SomeAbstraction:
    pass  # lots of stuff - but missing something

class Mixin1:
    def something(self):
        pass  # one implementation

class Mixin2:
    def something(self):
        pass  # another

class Concrete1(SomeAbstraction, Mixin1):
    pass

class Concrete2(SomeAbstraction, Mixin2):
    pass

これは、一種の抽象的なスーパークラスを使用し、ミキシンを使用して、不連続な具体的なサブクラスを作成するものである。