파이썬 문서에는 x==y
이 x.__eq__(y)
으로 명확하게 표시되어 있습니다. 그러나 많은 경우에 그 반대가 사실 인 것으로 보인다. 이 문제가 언제 또는 왜 발생했는지, 그리고 내 개체의 __cmp__
또는 __eq__
메서드가 호출되는지 여부를 확인하려면 어떻게해야합니까?이유/파이썬에서`x == y`가`y .__ eq __ (x)`를 호출 할 때?
편집 : 그냥 내가 __eq__
이 __cmp__
에 preferecne에서 호출되는 것을 알고 있지만, y.__eq__(x)
는 후자의 문서 상태가 일어날 것입니다 x.__eq__(y)
에 우선이라고하는 이유는 명확하지 않다 명확합니다.
>>> class TestCmp(object):
... def __cmp__(self, other):
... print "__cmp__ got called"
... return 0
...
>>> class TestEq(object):
... def __eq__(self, other):
... print "__eq__ got called"
... return True
...
>>> tc = TestCmp()
>>> te = TestEq()
>>>
>>> 1 == tc
__cmp__ got called
True
>>> tc == 1
__cmp__ got called
True
>>>
>>> 1 == te
__eq__ got called
True
>>> te == 1
__eq__ got called
True
>>>
>>> class TestStrCmp(str):
... def __new__(cls, value):
... return str.__new__(cls, value)
...
... def __cmp__(self, other):
... print "__cmp__ got called"
... return 0
...
>>> class TestStrEq(str):
... def __new__(cls, value):
... return str.__new__(cls, value)
...
... def __eq__(self, other):
... print "__eq__ got called"
... return True
...
>>> tsc = TestStrCmp("a")
>>> tse = TestStrEq("a")
>>>
>>> "b" == tsc
False
>>> tsc == "b"
False
>>>
>>> "b" == tse
__eq__ got called
True
>>> tse == "b"
__eq__ got called
True
편집 :
이- 리치 비교
__cmp__
__eq__
는 그것이__op__
(그리고__lt__
,__ge__
등을위한 유사__rop__
에 자신의입니다 오버라이드 (override) : 마크 디킨슨의 대답에서하는 것은 그 나타납니다 언급)- 왼쪽 개체가 기본 또는 새 스타일 클래스이고 오른쪽이 하위 클래스 인 경우 올바른 개체의왼쪽 개체의
__op__
이는 TestStrCmp
예제의 동작을 설명하기 전에이 시도됩니다. TestStrCmp
은 str
의 하위 클래스이지만 __eq__
을 구현하지 않으므로 str
의 __eq__
이 두 경우 모두에서 우선합니다 (즉, tsc == "b"
은 b.__eq__(tsc)
을 규칙 1로 인해 __rop__
으로 호출 함).
TestStrEq
의 예제에서 TestStrEq
은 str
의 하위 클래스이므로 기본 설정에서 호출되므로 tse.__eq__
이 두 인스턴스에서 호출됩니다.
TestEq
예에서
, TestEq
이 __eq__
구현하고 int
그렇게 __eq__
은 (규칙 1) 두 번 호출됩니다하지 않습니다.
하지만 여전히 첫 번째 예가 TestCmp
으로 이해되지 않습니다. tc
은 int
의 하위 클래스가 아니므로 AFAICT 1.__cmp__(tc)
을 호출해야하지만 그렇게하지 않아야합니다.
@Daniel Pryden : 서식 수정에 감사드립니다! 나는 다음에 blockquote를 기억하려고 노력할 것이다. –
좋은 생각이지만, (확실하지는 않지만) 모든'__rop__' 메쏘드는 더 이상 사용되지 않을 것이라고 생각했습니다. 또한 나는 그들 중 어느 것도 사용하지 않고있다. – Singletoned
'__rop__' 메서드를 사용하지 않는다고 동의합니다. 비교 방법은이 점에서 특별합니다 :'__eq__'는 그것의 역방향이므로'__op__'과'__rop__' 모두'__eq__'를 읽으십시오. (비슷하게,'__ne__'은 그것의 역방향이고,'__le__'은'__ge__와 반대입니다. ') 다른 사람들은 (정확하게, IMO) 전에 문서가 여기에서 어떤 작업을 사용할 수 있다고 언급했습니다. '__rop__' 메소드가 사용되지 않는 것은 거의 확실합니다! –