[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.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.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/
from https://stackoverflow.com/questions/3588776/how-is-eq-handled-in-python-and-in-what-order by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] for 중첩 된 루프 방지하기 (0) | 2018.10.04 |
---|---|
[PYTHON] 메소드에 인스턴스 멤버의 기본 인수 값을 전달하는 방법은 무엇입니까? (0) | 2018.10.04 |
[PYTHON] ImportError : _ssl이라는 모듈이 없습니다. (0) | 2018.10.04 |
[PYTHON] 파이썬 클래스를 복사하는 방법? (0) | 2018.10.04 |
[PYTHON] 리눅스를 통한 파이썬 프로세스 목록 (0) | 2018.10.04 |