1. ホーム
  2. python

[解決済み] Pythonのset([])はどのように2つのオブジェクトが等しいかどうかをチェックするのですか?これをカスタマイズするために、オブジェクトはどのようなメソッドを定義する必要があるのでしょうか?

2023-02-09 23:01:03

質問

Pythonで、私が定義した他のオブジェクトの記録を保持する「コンテナ」オブジェクトまたはクラスを作成する必要があります。このコンテナの1つの要件は、2つのオブジェクトが同一であると判断された場合、1つ(どちらか1つ)を削除することです。私が最初に考えたのは set([]) を含むオブジェクトとして使用し、この要件を満たすことでした。

しかし、このセットでは、2つの同じオブジェクトインスタンスのうちの1つを削除することはできません。1つを作成するために何を定義しなければなりませんか?

以下はPythonのコードです。

class Item(object):
  def __init__(self, foo, bar):
    self.foo = foo
    self.bar = bar
  def __repr__(self):
    return "Item(%s, %s)" % (self.foo, self.bar)
  def __eq__(self, other):
    if isinstance(other, Item):
      return ((self.foo == other.foo) and (self.bar == other.bar))
    else:
      return False
  def __ne__(self, other):
    return (not self.__eq__(other))

インタープリタ

>>> set([Item(1,2), Item(1,2)])
set([Item(1, 2), Item(1, 2)])

これは明らかに __eq__() で呼び出される x == y によって呼び出されるメソッドは、セットによって呼び出されるメソッドではありません。何が呼び出されるのでしょうか?他にどのようなメソッドを定義しなければならないのでしょうか?

注意 Item は変更可能である必要があり、変更される可能性があるので、私は __hash__() メソッドを提供することはできません。もしこの方法しかないのであれば、immutableを使用するように書き換える Item s.

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

恐れ入りますが __hash__() メソッドを用意する必要があります。しかし、このメソッドが Item .