私は、ABCを継承するクラスのメソッドが適切なデコレータを使用して作成されるようにする方法を理解しようとしています。私は(うまくいけば)ABCがどのように一般的に働くかを理解している。ABCはメソッドデコレータを強制しますか?
from abc import ABCMeta, abstractmethod
class MyABC(metaclass=ABCMeta):
@abstractmethod
def my_abstract_method(self):
pass
class MyClass(MyABC):
pass
MyClass()
これは、 "TypeError例外を:my_abstract_method抽象メソッドを持つ抽象クラスのMyClassのインスタンスを作成することはできません" 与えます。うーん、意味がある。その名前のメソッドを作成するだけです。
class MyClass(MyABC):
def my_abstract_method(self):
pass
MyClass()
ブーム。あなたは終わった。しかし、この事件はどうですか?
from abc import ABCMeta, abstractmethod
class MyABC(metaclass=ABCMeta):
@property
@abstractmethod
def my_attribute(self):
pass
class MyClass(MyABC):
def my_attribute(self):
pass
MyClass()
my_attributeがプロパティではないにもかかわらず、MyClass()呼び出しが機能します。私は結局すべてのABCは、特定の名前のメソッドが存在することを保証することになると思います。それでおしまい。それ以上のことを望むなら、MyABCのソースコードを見て、ドキュメントを読む必要があります。デコレータとコメントは、サブクラスをどのように構築する必要があるかを伝えます。
私はそれが正しいですか、私はここに何かを逃していますか?
これが、「抽象プロパティ」の目的です。 – user2357112
'' abstractproperty''はPython 3.3では廃止されました。 OPに3.3+の正しい使用法があります。 '' @ property''と '' @ abstractmethod''を一緒に基底クラスに、 '' @ property''をサブクラスに追加しました。しかし、それを正しく実装するためにサブクラスを強制することはできません。 –