2

私は、開発者グループによって管理されているプロジェクトの拡張に取り組んでいます。私のコードには、既存のコードからのクラスのメソッドのオーバーライドが含まれます。私にとって不快な点の 1 つは、スーパークラス メソッドをオーバーライドする正確な方法がわからないことです。

以下に説明を示します。

def foo(self):
    return self.something

これを拡張するとき、一般的に次のことを試みる必要があります。

(1)

def foo(self):
    old_something = super(Sub, self).foo()
    # my code
    return old_something

また

(2)

def foo(self):
    # my code
    return super(Sub, self).foo()

普遍的な答えはないと思いますが、デフォルトは何ですか? たとえば、CL では、この動作を指定しない場合、メソッドの組み合わせのデフォルトの修飾子は、 case (2):aroundを意味するです。しかし、たとえば Java では、慣例として、 super をオーバーライドするメソッドの最初の行、つまり case (1)で super を呼び出します。それを行うPythonの方法は何ですか?

編集:

私が行った場合:

$ find . -type f -name "*.py" | xargs grep '= super' | wc -l

私が取り組んでいるプロジェクトでは、より多くのヒットが得られます。

$ find . -type f -name "*.py" | xargs grep 'return super' | wc -l

単なる好奇心から。これはあなたの何人か/あなたのほとんどに当てはまりますか? :)

4

2 に答える 2

2

それは慣習ではなく、何が正しいかについてです。オーバーライドしているメソッドが何をするのか、そしてそのコントラクトが何であるのかを見て、正しいことをするコードを書く必要があります。「before」(メソッドの最後のスーパークラス呼び出し)、「after」(最初のスーパークラス呼び出し)、「around」(途中のスーパークラス呼び出し)、または「override」(noスーパークラス呼び出し)は、メソッドのセマンティクスに応じてすべて正しくなる可能性があります。

もちろん、それが本当に問題にならないこともあります。コードは、複数のオプションでも同様に機能します。その場合、私は「後」(最初にスーパークラス呼び出し、次に独自のコード)に傾倒します。これは、デバッグが一般的なものから特定のものへと順番に操作を実行するのに役立つためです。

于 2012-10-05T16:41:59.983 に答える
0

上書きしようとしているメソッドが何らかの方法でクラスを変更し、それらの変更に依存している場合は、最初のメソッドを参照して、メソッドのロジックが本来意図されていた方法でクラスに影響を与えることができるようにします。

メソッドが親クラスに影響を与えた可能性のあるものからロジックが完全に離れている場合は、2 番目のメソッドを使用します。それは実際には操作の順序の問題であり、super()ed メソッドがクラスに対して何かを行うかどうか、目前の実際の問題を解決するために依存しているクラスです。

于 2012-10-05T16:38:54.573 に答える