IT TIP

__eq__는 파이썬에서 어떻게 그리고 어떤 순서로 처리됩니까?

itqueen 2020. 10. 23. 19:50
반응형

__eq__는 파이썬에서 어떻게 그리고 어떤 순서로 처리됩니까?


Python은 비교 연산자의 왼쪽 / 오른쪽 버전을 제공하지 않기 때문에 호출 할 함수를 어떻게 결정합니까?

class A(object):
    def __eq__(self, other):
        print "A __eq__ called"
        return self.value == other
class B(object):
    def __eq__(self, other):
        print "B __eq__ called"
        return self.value == other

>>> a = A()
>>> a.value = 3
>>> b = B()
>>> b.value = 4
>>> a == b
"A __eq__ called"
"B __eq__ called"
False

이것은 두 __eq__기능을 모두 호출하는 것 같습니다 . 공식 의사 결정 트리를 찾고 있습니다.


a == b표현은 호출 A.__eq__이 존재하기 때문에. 코드에는 self.value == other. int는 자신을 B와 비교하는 방법을 모르기 때문에 Python B.__eq__은 자신을 int와 비교하는 방법을 알고 있는지 확인하기 위해 호출 시도합니다 .

비교되는 값을 표시하도록 코드를 수정하는 경우 :

class A(object):
    def __eq__(self, other):
        print("A __eq__ called: %r == %r ?" % (self, other))
        return self.value == other
class B(object):
    def __eq__(self, other):
        print("B __eq__ called: %r == %r ?" % (self, other))
        return self.value == other

a = A()
a.value = 3
b = B()
b.value = 4
a == b

다음과 같이 인쇄됩니다.

A __eq__ called: <__main__.A object at 0x013BA070> == <__main__.B object at 0x013BA090> ?
B __eq__ called: <__main__.B object at 0x013BA090> == 3 ?

Python2.x가를 발견 a == b하면 다음을 시도합니다.

  • 경우 type(b)새로운 스타일의 클래스이며, type(b)의 서브 클래스 type(a), 그리고 type(b)무시했다 __eq__, 결과입니다 b.__eq__(a).
  • 경우 type(a)오버라이드 (override)가 __eq__(이라고 type(a).__eq__하지 않습니다 object.__eq__), 결과입니다 a.__eq__(b).
  • type(b)재정의 된 경우 __eq__결과는 b.__eq__(a)입니다.
  • 위의 경우에 해당하지 않는 경우 Python은 __cmp__. 존재하는 경우 객체는를 반환하면 동일합니다 zero.
  • 최종 폴백으로 Python object.__eq__(a, b)Trueiff a이고 b동일한 객체 인을 호출 합니다.

특수 메서드가을 반환 NotImplemented하면 Python은 메서드가 존재하지 않는 것처럼 작동합니다.

조심스럽게 그 마지막 단계를 참고 : 둘 경우 ab과부하 ==, 다음 a == b과 같은입니다 a is b.


에서 https://eev.ee/blog/2012/03/24/python-faq-equality/

참고 URL : https://stackoverflow.com/questions/3588776/how-is-eq-handled-in-python-and-in-what-order

반응형