반응형
__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)
은True
iffa
이고b
동일한 객체 인을 호출 합니다.
특수 메서드가을 반환 NotImplemented
하면 Python은 메서드가 존재하지 않는 것처럼 작동합니다.
조심스럽게 그 마지막 단계를 참고 : 둘 경우 a
도 b
과부하 ==
, 다음 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
반응형
'IT TIP' 카테고리의 다른 글
Swift에서 JSON 문자열을 Object로 변환하는 간단하고 깨끗한 방법 (0) | 2020.10.23 |
---|---|
C #에서 여러 문자열 요소 바꾸기 (0) | 2020.10.23 |
jQuery를 사용할 때 변수 앞에 "$"를 붙여야하는시기와 이유는 무엇입니까? (0) | 2020.10.23 |
JavaScript 객체를 파괴하는 방법? (0) | 2020.10.23 |
클릭시 Bootstrap 드롭 다운을 열어 둡니다. (0) | 2020.10.23 |