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 のソース コードを見て、ドキュメントを読む必要があります。そこにあるデコレータとコメントは、サブクラスをどのように構築する必要があるかを知らせます。
私はそれを正しく持っていますか、それともここで何かが欠けていますか?