1. ホーム
  2. パイソン

[解決済み】Pythonでは、メソッドをオーバーライドしていることを示すにはどうすればよいですか?

2022-04-09 11:39:44

質問

Javaでは、例えば @Override アノテーションは、オーバーライドをコンパイル時にチェックするだけでなく、優れたセルフ・ドキュメント・コードになります。

私はドキュメントを探しているだけです(pylintのような何らかのチェッカーへの指標になれば、それはボーナスなのですが)。私はどこかにコメントやdocstringを追加することができますが、Pythonでオーバーライドを示すための慣用的な方法は何でしょうか?

どのように解決するのですか?

これとfwc:さんの回答に基づいて、私はpipでインストール可能なパッケージを作りました。 https://github.com/mkorpela/overrides

時々、ここでこの質問を見てしまうことがあります。 主に、私たちのコードベースで(再び)同じバグを見た後に起こります。誰かが、インターフェイスのメソッドの名前を変更する際に、インターフェイスの実装クラスを忘れてしまったのです。

PythonはJavaではありませんが、Pythonにはパワーがあり、暗黙の了解より明示のほうがいいのです。

というわけで、オーバーライド・デコレーターのスケッチです。これは、パラメータとして与えられたクラスが、デコレートされるメソッドと同じメソッド(または何か)名を持っていることをチェックします。

もし、もっと良い解決策を思いついたら、ここに投稿してください。

def overrides(interface_class):
    def overrider(method):
        assert(method.__name__ in dir(interface_class))
        return method
    return overrider

以下のように動作します。

class MySuperInterface(object):
    def my_method(self):
        print 'hello world!'


class ConcreteImplementer(MySuperInterface):
    @overrides(MySuperInterface)
    def my_method(self):
        print 'hello kitty!'

で、誤ったバージョンで実行すると、クラスのロード時にアサーションエラーが発生します。

class ConcreteFaultyImplementer(MySuperInterface):
    @overrides(MySuperInterface)
    def your_method(self):
        print 'bye bye!'

>> AssertionError!!!!!!!