2012-10-06 3 views
2

나는 서브 클래스가 tuple 인 클래스가 있습니다. 그 클래스의 인스턴스를 set의 요소로 사용하고 싶습니다만, 오류가없는 유형이라는 오류가 발생합니다. 나는 이것이 __eq____ne__ 방법을 오버라이드했기 때문에 이것이라고 생각합니다. 내 형식의 해시 가능성을 복원하려면 어떻게해야합니까? 나는 파이썬 3.2를 사용하고있다.튜플의 하위 클래스를 파이썬에서 해시 가능하게 만드는 방법은 무엇입니까?

+2

[''__hash__()''] (http://docs.python.org/reference/datamodel.html#object.__hash__)을 구현해야합니다. 검색을 수행하면 가장 먼저 발견 할 수 있습니다. 이. –

+1

[The docs] (http://docs.python.org/2/reference/datamodel.html#object.__hash__)는 해시 가능 클래스에서 파생되었지만 예를 들어 상속 된 클래스를 말합니다. '__eq __()'을 해시 할 수 있으려면'__hash __()'을 오버라이드해야합니다. 이 행동은 전혀 분명한 것이 아니기 때문에 정당한 질문입니다. 다소 국한 될 수도 있지만 너무 많이 생각하지 않습니다. 그러므로 다시 투표 할 내 표결. – pillmuncher

답변

2

당신은 타입 해시 가능이 필요합니다. 이것은 터플에서 파생되는 클래스에 __hash__() 멤버 함수를 구현하는 것을 의미합니다.

예를 들어

:

class test(tuple): 
    def __eq__(self,comp): 
     return self[0] == comp[0] 
    def __ne__(self,comp): 
     return self[0] != comp[0] 
    def __hash__(self): 
     return hash(self[0]) 

을 그리고 이것은 지금 모습입니다 :

>>> set([test([1,]),test([2,]),test([3,])]) 
{(1,), (2,), (3,)} 
>>> hash(test([1,])) 
1 

참고 : 당신은 절대적으로 관계를 이해하기 위해, __hash__() 기능에 대한 설명서를 읽어야합니다 비교 연산자와 해시 계산 사이. 동일한 비교

+4

'tuple'의 원래 해시 함수를 사용할 수 있습니다 :'tuple .__ hash __ (self)' –

+3

물론 가능합니다. 당신은 또한 슈퍼 클래스'super (test, self) .__ hash __ (self)', 그 밖의 다른 것들을 사용할 수 있습니다 ... –

+1

당신의 예제는 장난 꾸러기입니다 - "유일한 필수 속성은 같은 것을 비교하는 객체들이 동일하다는 것입니다 해시 값 "http://docs.python.org/reference/datamodel.html#object.__hash__ –

3

객체는 same hash value

그래서 당신이 더 나은이

class test(tuple): 
    def __eq__(self,comp): 
     return self[0] == comp[0] 
    def __ne__(self,comp): 
     return self[0] != comp[0] 
    def __hash__(self): 
     return hash((self[0],)) 
등이 될 것입니다 평등을

아드의 예를 비교하기 위해 사용하는 속성에 해시를 기반으로하는 것이 좋습니다 있어야한다

우리가 관심을 갖는 것들을 포함하는 튜플의 해시를 활용하면된다.

+0

그것은'__ne__'이 아니라'__ne__'입니다. – user4815162342

관련 문제