복붙노트

[PYTHON] __eq__는 파이썬에서 어떤 순서로 처리됩니까?

PYTHON

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

파이썬은 비교 연산자의 왼쪽 / 오른쪽 버전을 제공하지 않으므로 호출 할 함수를 어떻게 결정합니까?

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__ 함수를 모두 호출하는 것 같습니다. 공식적인 결정 트리를 찾고 있습니다.

해결법

  1. ==============================

    1.a == b 표현식은 존재하기 때문에 A .__ eq__를 호출합니다. 그 코드는 self.value == other를 포함합니다. int가 B를 자신과 비교하는 방법을 모르기 때문에, Python은 B .__ eq__를 호출하여 자신을 int와 비교하는 방법을 알고 있는지 확인합니다.

    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.value
    class B(object):
        def __eq__(self, other):
            print "B __eq__ called: %r == %r ?" % (self, other)
            return self.value == other.value
    
    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 ?
    
  2. ==============================

    2.Python2.x는 a == b를 볼 때 다음을 시도합니다.

    Python2.x는 a == b를 볼 때 다음을 시도합니다.

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

    마지막 단계는주의 깊게 살펴보십시오 : a 또는 b가 ==을 오버로드하지 않으면 a == b는 a와 동일합니다. b.

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

  3. from https://stackoverflow.com/questions/3588776/how-is-eq-handled-in-python-and-in-what-order by cc-by-sa and MIT license