2

__hash__()クラスがあり、このクラスのメソッドを書きたいと思っています。私が書きたいメソッドは、場合によってはオブジェクトのデフォルトのハッシュを返し、他の場合にはその属性の 1 つのハッシュを返します。したがって、簡単なテストケースとして:

class Foo:
    def __init__(self, bar):
        self.bar = bar
    def __hash__(self):
        if self.bar < 10:
            return hash(self) # <- this line doesn't work
        else:
            return hash(self.bar)

これの問題は、hash(self)単純に を呼び出しself.__hash__()、無限再帰につながることです。

オブジェクトのハッシュはそのオブジェクトの に基づいていることがわかったので、 、 またはのようid()に書き直すことができますが、自分のコードでデフォルトの実装を再作成するのは悪い方法のように思えます。return hash(self)return id(self)return id(self) / 16

と書き直せることも思いつきましたreturn object.__hash__(self)。これは機能しますが、特別なメソッドは直接呼び出されることを意図していないため、さらに悪いようです。

だから、私が求めているのは; __hash__()オブジェクトがインスタンスであるクラスのメソッドを暗黙的に呼び出すことなく、オブジェクトのデフォルトのハッシュを使用する方法はありますか?

4

1 に答える 1

6

親実装を呼び出すには、次を使用します。

super(Foo, self).__hash__()

と書き直せることも思いつきましたreturn object.__hash__(self)。これは機能しますが、特別なメソッドは直接呼び出されることを意図していないため、さらに悪いようです。

マジック メソッドをオーバーライドしているので、親の実装を直接呼び出しても問題ありません。

于 2012-07-30T06:22:20.560 に答える