web-dev-qa-db-ja.com

コードを読みやすくするために、Pythonに@overrideデコレータがないのはなぜですか?

私はPython with ABCMetaで抽象クラスを使用しています。抽象メソッドを作成するときは、デコレータ@abstractmethodでタグ付けします。 (および他の言語とは異なり)サブクラスがスーパークラスメソッドをオーバーライドする場合、@overrideのようなデコレータは提供されません。これの背後にあるロジックが何か知っている人はいますか?

このため、コードを読んでいる人が、抽象メソッドをオーバーライド/実装するメソッドと、サブクラスにのみ存在するメソッドをすばやく確立するのがやや混乱します。

20
gnychis

PythonデコレータとJavaアノテーションを混同しています。同様の構文にもかかわらず、それらは完全に異なるものです。AJavaアノテーションはコンパイラへの指示です。しかし、Pythonデコレータは、具体的な処理を実行する実行可能コードです:関数を別の関数にラップし、関数を変更できます。これは、abstractmethodの場合のみです。他のデコレータと同じように、それは何かを行う、つまりオーバーライドが必要なメソッドがあることをABCに伝えます。

9
Daniel Roseman

@overrideを追加しようとする際の問題は、メソッド定義時に、デコレータがメソッドが実際に別のメソッドをオーバーライドするかどうかを判断する方法がないことです。親クラス(または、まだ存在していない現在のクラス)にはアクセスできません。

@overrideを追加する場合、@overrideデコレータは実際にはオーバーライドチェックを実行できません。次に、2つのオプションがあります。 isオーバーライドチェックはありません。この場合、@overrideはコメントに勝るものではありません。または、typeコンストラクタは@overrideを具体的に認識し、クラスの作成時にチェックする必要があります。 @overrideのような便利な機能は、そのような型システム実装のコア部分を複雑にする必要はありません。また、誤って@overrideをメソッド以外に配置した場合、装飾された関数を呼び出して奇妙なTypeErrorを取得するまで、バグは検出されません。

9
user2357112