5

오버로드 된 비교 연산자가있는 int 파생 클래스가 있습니다.오버로드 된 비교 연산자를 사용하여 int 파생 클래스에서 원본 int 비교에 액세스

오버로드 된 메서드 본문에서는 원래 연산자를 사용해야합니다.

장난감 예 :

>>> class Derived(int): 
...  def __eq__(self, other): 
...   return super(Derived, self).__eq__(other) 

파이썬 3.3 이상으로 잘 작동하지만 예외 AttributeError: 'super' object has no attribute '__eq__' 파이썬 2.7와 함께 실패합니다.

나는 매우 깨끗하지 발견 여러 walkarrounds에 대해 생각할 수있는

:

return int(self) == other 

그냥 비교하는 새로운 int 객체의 생성을 필요로

try: 
    return super(Derived, self).__eq__(other) 
except AttributeError: 
    return super(Derived, self).__cmp__(other) == 0 

기반 제어 흐름을 분리하면서 파이썬 버전에서, 나는 끔찍한 지저분한 발견 (그래서 파이썬 버전을 명시 적으로 검사하고있다).

Python 2.7 및 3.3+을 사용하여 우아한 방식으로 원래 정수 비교에 액세스하려면 어떻게해야합니까?

+1

당신은 액세스 할 수있는''슈퍼 .__ eq__'를 통해 방법을 비교 int'. 그러나, 파이썬 버전에 따라 메소드를 비교하는 빌트인 타입은 많이 다르다. 그러므로 python2는'super.eq'는 1 개의 인자가 필요하고 python3은 2가 필요합니다. – infotoni91

+0

'int (self) == int (other)'를 너무 지저분하다고 생각합니까? – Phillip

+0

@Phillip 그것은'int (self) == other'보다 하나 더 많은 객체를 만듭니다. – abukaj

답변

0

int에 클래스를 정의하기 전에 __eq__을 정의해야한다고 생각합니다. 예를 들어 :

int = 5 
def int.__eq__(self, other): 
    return self.real == other 
IntDerived = Derived(int) 

이것은 super 클래스에게 __eq__ 속성을 제공해야합니다.


주요 아이디어는 일

을 편집 할 수 있지만 코드가 작동하지 않는 내 관심을 끌게되었습니다. 그래서 : hasattr 파이썬 버전을 확인 명시 적으로, 새로운 int 객체를 생성 예외를 잡기 또는 방지하여

class Derived(int): 
    def __eq__(self, other): 
     return self.real == other 

Int = 5 
D = Derived(Int) 
D.__eq__(4) #Output: False 
D.__eq__(5) #Output: True 
+1

그건 파이썬이 아닙니다. – Goyo

+0

@ GreenHawk1220'Derived' 클래스 정의에'__eq __()'메소드를 넣으면 (파이썬에서 작동하게) 대답을 받아 들일 것입니다. '.real' 속성에 접근하는 아이디어는 작동하지만 코드는 파이썬이 아닙니다. – abukaj

+0

업데이트 된 코드가 도움이되었습니다. – GreenHawk1220

2

파이썬 2와 3은 서로 크게 다르므로 글 머리 기호를 확인하고 버전을 확인해야한다고 생각합니다. 두 가지 모두에서 작동하는 코드를 작성하려는 경우 (조만간 패치 할 필요가있는 내용을 발견 할 수 있음) 예상됩니다. 성능에 미치는 영향을 피하려면 다음과 같이 할 수 있습니다.

from six import PY2 

class Derived(int): 
    if PY2: 
     def __eq__(self, other): 
      return super(Derived, self).__cmp__(other) == 0 
    else: 
     def __eq__(self, other): 
      return super(Derived, self).__eq__(other) 

그게 내가하는 행동입니다. 난 정말 당신이 정말로하고 싶지 않은 경우, int ...

를 서브 클래 싱하고 싶었다면 아마 당신은 시도 할 수 :

class Derived(int): 
    def __eq__(self, other): 
     return (self^other) == 0 

을 분명히 성능에 대해 관심이 있다면 당신이 몇 가지 프로파일을해야 할 것이다 코드의 나머지 부분 중 하나가 상당히 악화되는지 알아보십시오.

+0

후자의 접근 방식을 좋아하지만'other'가 부동 소수점 일 때 작동하지 않습니다. – abukaj

0

: 코드를 개선.

아래 코드는 Python 2.7 및 3에서 작동합니다.3+ :

class Derived(int): 
    def __eq__(self, other): 
     return super(Derived, self).__cmp__(other) == 0 if hasattr(Derived, "__cmp__") else super(Derived, self).__eq__(other) 
1

두 버전이 __xor__ 메소드를 구현, 당신이 시도 할 수 :

class Derived(int): 
    def __eq__(self, other): 
     return not super(Derived, self).__xor__(other) 
+0

나는 대답을 좋아한다. 아주 깨끗하지도 않고 플로트와 비교해서도 작동하지 않습니다. 또한 '슈퍼'객체를 만들 필요가 없다고 생각합니다. '셀프 (self)'로 충분합니다. 'self^other'는 더 간단 할 수 있습니다. – abukaj