반응형
파이썬 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
호출되는은 세트에 의해 호출되는 메서드가 아님 이 분명합니다 . 무엇이라고하나요? 다른 어떤 방법을 정의해야합니까?
참고 : Item
s는 변경 가능해야하며 변경 될 수 있으므로 메서드를 제공 할 수 없습니다 __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__())
반응형
'Development Tip' 카테고리의 다른 글
API를 사용하여 기본 MailChimp 가입 양식 만들기 (0) | 2020.10.24 |
---|---|
파이썬 추상 클래스에서 추상 속성을 만드는 방법 (0) | 2020.10.24 |
google-services.json (Firebase에서)을 내 저장소에 추가해야하나요? (0) | 2020.10.24 |
대규모 코드베이스에 익숙해지는 가장 좋은 방법은 무엇입니까? (0) | 2020.10.24 |
ExecutorService (특히 ThreadPoolExecutor)는 스레드로부터 안전합니까? (0) | 2020.10.24 |