[PYTHON] Python의 속성에 따라 객체 인스턴스를 비교합니다.
PYTHONPython의 속성에 따라 객체 인스턴스를 비교합니다.
어떤 객체의 두 인스턴스를 파이썬에서 동일한 지 비교하는 가장 좋은 방법은 무엇입니까? 나는 뭔가를 할 수 있기를 바란다.
예:
doc1 = ErrorDocument(path='/folder',title='Page')
doc2 = ErrorDocument(path='/folder',title='Page')
if doc1 == doc2: # this should be True
#do something
편집하다:
질문을 더 명확하게하기. 속성 값으로 비교하고보다 일반적인 솔루션을 만들고 싶습니다.
def __eq__(self, other):
return self.path == other.path and self.title == other.title
__eq __ () 메서드는 다음과 비슷해야합니까?
def __eq__(self, other):
# Is the other instance of the same object
# Loop through __dict__ and compare values to attributes of other
해결법
-
==============================
1.평소와 마찬가지로 파이썬은 KISS입니다.
평소와 마찬가지로 파이썬은 KISS입니다.
class Test(object): def __init__(self, attr1, attr2): self.attr1 = attr1 self.attr2 = attr2 def __str__(self): return str(self.__dict__) def __eq__(self, other): return self.__dict__ == other.__dict__ t1 = Test("foo", 42) t2 = Test("foo", 42) t3 = Test("bar", 42) print t1, t2, t3 print t1 == t2 print t2 == t3
그것은 출력 :
{'attr2': 42, 'attr1': 'foo'} {'attr2': 42, 'attr1': 'foo'} {'attr2': 42, 'attr1': 'bar'} True False
N.B. : Python 3.0 이전에는 __eq__ 대신 __cmp__를 사용하는 경향이 높다는 점을 알고 있어야합니다.
-
==============================
2.개체의 비교 연산자를 재정의합니다.
개체의 비교 연산자를 재정의합니다.
class MyClass: def __lt__(self, other): # return comparison def __le__(self, other): # return comparison def __eq__(self, other): # return comparison def __ne__(self, other): # return comparison def __gt__(self, other): # return comparison def __ge__(self, other): # return comparison
이렇게 :
def __eq__(self, other): return self._id == other._id
-
==============================
3.클래스에 __eq__ 메소드를 구현하십시오. 이 같은:
클래스에 __eq__ 메소드를 구현하십시오. 이 같은:
def __eq__(self, other): return self.path == other.path and self.title == other.title
편집 : 개체가 동일한 인스턴스 사전이있는 경우에만 같음을 비교하려면 다음을 수행합니다.
def __eq__(self, other): return self.__dict__ == other.__dict__
-
==============================
4.요약하면 다음과 같습니다.
요약하면 다음과 같습니다.
-
==============================
5.객체 인스턴스를 비교할 때 __cmp__ 함수가 호출됩니다.
객체 인스턴스를 비교할 때 __cmp__ 함수가 호출됩니다.
== 연산자가 기본적으로 작동하지 않으면 개체에 대해 __cmp__ 함수를 언제든지 다시 정의 할 수 있습니다.
편집하다:
지적했듯이 __cmp__ 함수는 3.0부터 사용되지 않습니다. 대신 "풍부한 비교"방법을 사용해야합니다.
-
==============================
6.속성 별 비교를 원하고 실패한 경우와 실패한 곳을 보려면 다음 목록 이해를 사용할 수 있습니다.
속성 별 비교를 원하고 실패한 경우와 실패한 곳을 보려면 다음 목록 이해를 사용할 수 있습니다.
[i for i,j in zip([getattr(committed_vans_events[0][0].request, attr) for attr in dir(committed_vans_events[0][0].request)], [getattr(self.vans_states[0].onboard_passengers[0], attr) for attr in dir(self.vans_states[0].onboard_passengers[0])]) if not i==j]
여기서 추가적인 이점은 PyCharm에서 디버깅 할 때 "Evaluate Expression"창에 한 줄 짜낼 수 있다는 것입니다.
-
==============================
7.나는 초기 예제 (위의 7 참조)를 시도하고 ipython에서 작동하지 않았다. cmp (obj1, obj2)는 두 개의 동일한 객체 인스턴스를 사용하여 구현 될 때 "1"을 반환합니다. 이상하게도 속성 값 중 하나를 수정하고 다시 컴파일하면 cmp (obj1, obj2)를 사용하여 객체가 "1"을 계속 반환합니다. (한숨...)
나는 초기 예제 (위의 7 참조)를 시도하고 ipython에서 작동하지 않았다. cmp (obj1, obj2)는 두 개의 동일한 객체 인스턴스를 사용하여 구현 될 때 "1"을 반환합니다. 이상하게도 속성 값 중 하나를 수정하고 다시 컴파일하면 cmp (obj1, obj2)를 사용하여 객체가 "1"을 계속 반환합니다. (한숨...)
좋습니다, 그래서 당신이해야 할 일은 두 개의 객체를 반복하고 == 부호를 사용하여 각 속성을 비교하는 것입니다.
-
==============================
8.==와 비교했을 때 클래스의 인스턴스는 비 동일하게됩니다. 가장 좋은 방법은 물건을 처리 할 클래스에 cmp 함수를 사용하는 것입니다.
==와 비교했을 때 클래스의 인스턴스는 비 동일하게됩니다. 가장 좋은 방법은 물건을 처리 할 클래스에 cmp 함수를 사용하는 것입니다.
내용으로 비교하기를 원할 경우 간단히 cmp (obj1, obj2)를 사용할 수 있습니다.
귀하의 경우 cmp (doc1, doc2) 내용이 동일하면 -1을 반환합니다.
from https://stackoverflow.com/questions/1227121/compare-object-instances-for-equality-by-their-attributes-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 내 장고 요청에서 내 JSON 데이터는 어디에 있습니까? (0) | 2018.10.09 |
---|---|
[PYTHON] matplotlib을 사용하여 두 개의 히스토그램을 동시에 플롯합니다. (0) | 2018.10.09 |
[PYTHON] Spark에서 INFO 로깅을 끄는 방법은 무엇입니까? (0) | 2018.10.09 |
[PYTHON] 파이썬에서 캐치되지 않은 예외를 로깅하기 (0) | 2018.10.09 |
[PYTHON] 파이썬에서 줄임표 슬라이싱 구문을 어떻게 사용합니까? [복제] (0) | 2018.10.09 |