私はPython with ABCMeta
で抽象クラスを使用しています。抽象メソッドを作成するときは、デコレータ@abstractmethod
でタグ付けします。 (および他の言語とは異なり)サブクラスがスーパークラスメソッドをオーバーライドする場合、@override
のようなデコレータは提供されません。これの背後にあるロジックが何か知っている人はいますか?
このため、コードを読んでいる人が、抽象メソッドをオーバーライド/実装するメソッドと、サブクラスにのみ存在するメソッドをすばやく確立するのがやや混乱します。
PythonデコレータとJavaアノテーションを混同しています。同様の構文にもかかわらず、それらは完全に異なるものです。AJavaアノテーションはコンパイラへの指示です。しかし、Pythonデコレータは、具体的な処理を実行する実行可能コードです:関数を別の関数にラップし、関数を変更できます。これは、abstractmethodの場合のみです。他のデコレータと同じように、それは何かを行う、つまりオーバーライドが必要なメソッドがあることをABCに伝えます。
@override
を追加しようとする際の問題は、メソッド定義時に、デコレータがメソッドが実際に別のメソッドをオーバーライドするかどうかを判断する方法がないことです。親クラス(または、まだ存在していない現在のクラス)にはアクセスできません。
@override
を追加する場合、@override
デコレータは実際にはオーバーライドチェックを実行できません。次に、2つのオプションがあります。 isオーバーライドチェックはありません。この場合、@override
はコメントに勝るものではありません。または、type
コンストラクタは@override
を具体的に認識し、クラスの作成時にチェックする必要があります。 @override
のような便利な機能は、そのような型システム実装のコア部分を複雑にする必要はありません。また、誤って@override
をメソッド以外に配置した場合、装飾された関数を呼び出して奇妙なTypeErrorを取得するまで、バグは検出されません。