Development Tip

파이썬 set ([])은 두 객체가 같은지 어떻게 확인합니까?

yourdevel 2020. 10. 24. 12:00
반응형

파이썬 set ([])은 두 객체가 같은지 어떻게 확인합니까? 이것을 사용자 정의하기 위해 객체는 어떤 메소드를 정의해야합니까?


파이썬에서 '컨테이너'객체 또는 클래스를 만들어야합니다.이 클래스는 내가 정의한 다른 객체의 기록을 유지합니다. 이 컨테이너의 한 가지 요구 사항은 두 개체가 동일한 것으로 간주되면 하나 (둘 중 하나)가 제거된다는 것입니다. 내 첫 번째 생각은 set([])이 요구 사항을 완료하기 위해 포함 객체로 를 사용하는 것이 었습니다 .

그러나 집합은 두 개의 동일한 개체 인스턴스 중 하나를 제거하지 않습니다. 만들려면 무엇을 정의해야합니까?

다음은 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호출되는은 세트에 의해 호출되는 메서드가 아님 이 분명합니다 . 무엇이라고하나요? 다른 어떤 방법을 정의해야합니까?

참고 : Items는 변경 가능해야하며 변경 될 수 있으므로 메서드를 제공 할 수 없습니다 __hash__(). 이것이 유일한 방법이라면 불변 Item사용을 위해 다시 작성할 것 입니다.


__hash__()방법 을 제공해야합니다 . 그러나 .NET Framework의 변경 가능한 속성에 의존하지 않는 방식으로 코딩 할 수 있습니다 Item.


예, __hash__()이미 제공 -method와 비교 연산자 가 필요합니다 .

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))
    def __hash__(self):
        return hash(self.__repr__())

참고 URL : https://stackoverflow.com/questions/3942303/how-does-a-python-set-check-if-two-objects-are-equal-what-methods-does-an-o

반응형