Pythonの抽象クラスとインターフェースの違いは何ですか?
8 に答える
ときどき表示されるのは、次のようなものです。
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 には正式なインターフェイス コントラクトがない (必要もない) ため、抽象化とインターフェイスの間の Java スタイルの区別は存在しません。誰かが正式なインターフェイスを定義しようとすると、それも抽象クラスになります。唯一の違いは、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
これは、ミックスインで一種の抽象スーパークラスを使用して、互いに素な具体的なサブクラスを作成します。
Python >= 2.6 にはAbstract Base Classesがあります。
抽象基本クラス (略して ABC) は、hasattr() などの他の手法が扱いにくい場合にインターフェイスを定義する方法を提供することで、ダックタイピングを補完します。Python には、データ構造 (collections モジュール内)、数値 (numbers モジュール内)、およびストリーム (io モジュール内) 用の組み込みの ABC が多数付属しています。abc モジュールを使用して、独自の ABC を作成できます。
ツイストのように、Zope 外のプロジェクトで使用されるZope Interfaceモジュールもあります。私はあまり詳しくありませんが、役立つかもしれない wiki ページがここにあります。
一般に、抽象クラスの概念や Python のインターフェイスは必要ありません (編集済み - 詳細については、S.Lott の回答を参照してください)。
より基本的な説明: インターフェイスは、空のマフィン型のようなものです。これは、コードを持たない一連のメソッド定義を含むクラス ファイルです。
抽象クラスも同じですが、すべての関数が空である必要はありません。コードを持つものもあります。厳密には空ではありません。
差別化する理由: Python には実際的な違いはあまりありませんが、大規模なプロジェクトの計画レベルでは、コードがないため、インターフェイスについて話すのがより一般的かもしれません。特に、この用語に慣れている Java プログラマーと一緒に作業している場合は注意が必要です。
Python にはどちらの概念も実際にはありません。
ダックタイピングを使用しているため、インターフェースの必要がなくなりました(少なくともコンピューターの場合:-))
Python <= 2.5: 基本クラスは明らかに存在しますが、メソッドを「純粋仮想」としてマークする明示的な方法がないため、クラスは実際には抽象的ではありません。
Python >= 2.6: 抽象基本クラスは存在します( http://docs.python.org/library/abc.html )。また、サブクラスで実装する必要があるメソッドを指定できるようにします。構文はあまり好きではありませんが、機能はそこにあります。ほとんどの場合、「使用中」のクライアント側からダック タイピングを使用する方がよいでしょう。
一般に、インターフェースは、単一継承クラスモデルを使用する言語でのみ使用されます。これらの単一継承言語では、通常、クラスが特定のメソッドまたはメソッドのセットを使用できる場合にインターフェイスが使用されます。また、これらの単一継承言語では、抽象クラスを使用して、メソッドがないかそれ以上に加えてクラス変数を定義するか、単一継承モデルを利用して一連のメソッドを使用できるクラスの範囲を制限します。
多重継承モデルをサポートする言語は、クラスまたは抽象基本クラスのみを使用する傾向があり、インターフェースは使用しません。Pythonは多重継承をサポートしているため、インターフェースを使用せず、基本クラスまたは抽象基本クラスを使用する必要があります。