복붙노트

[PYTHON] Python의 속성에 따라 객체 인스턴스를 비교합니다.

PYTHON

Python의 속성에 따라 객체 인스턴스를 비교합니다.

어떤 객체의 두 인스턴스를 파이썬에서 동일한 지 비교하는 가장 좋은 방법은 무엇입니까? 나는 뭔가를 할 수 있기를 바란다.

예:

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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.요약하면 다음과 같습니다.

    요약하면 다음과 같습니다.

  5. ==============================

    5.객체 인스턴스를 비교할 때 __cmp__ 함수가 호출됩니다.

    객체 인스턴스를 비교할 때 __cmp__ 함수가 호출됩니다.

    == 연산자가 기본적으로 작동하지 않으면 개체에 대해 __cmp__ 함수를 언제든지 다시 정의 할 수 있습니다.

    편집하다:

    지적했듯이 __cmp__ 함수는 3.0부터 사용되지 않습니다. 대신 "풍부한 비교"방법을 사용해야합니다.

  6. ==============================

    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.나는 초기 예제 (위의 7 참조)를 시도하고 ipython에서 작동하지 않았다. cmp (obj1, obj2)는 ​​두 개의 동일한 객체 인스턴스를 사용하여 구현 될 때 "1"을 반환합니다. 이상하게도 속성 값 중 하나를 수정하고 다시 컴파일하면 cmp (obj1, obj2)를 사용하여 객체가 "1"을 계속 반환합니다. (한숨...)

    나는 초기 예제 (위의 7 참조)를 시도하고 ipython에서 작동하지 않았다. cmp (obj1, obj2)는 ​​두 개의 동일한 객체 인스턴스를 사용하여 구현 될 때 "1"을 반환합니다. 이상하게도 속성 값 중 하나를 수정하고 다시 컴파일하면 cmp (obj1, obj2)를 사용하여 객체가 "1"을 계속 반환합니다. (한숨...)

    좋습니다, 그래서 당신이해야 할 일은 두 개의 객체를 반복하고 == 부호를 사용하여 각 속성을 비교하는 것입니다.

  8. ==============================

    8.==와 비교했을 때 클래스의 인스턴스는 비 동일하게됩니다. 가장 좋은 방법은 물건을 처리 할 클래스에 cmp 함수를 사용하는 것입니다.

    ==와 비교했을 때 클래스의 인스턴스는 비 동일하게됩니다. 가장 좋은 방법은 물건을 처리 할 클래스에 cmp 함수를 사용하는 것입니다.

    내용으로 비교하기를 원할 경우 간단히 cmp (obj1, obj2)를 사용할 수 있습니다.

    귀하의 경우 cmp (doc1, doc2) 내용이 동일하면 -1을 반환합니다.

  9. from https://stackoverflow.com/questions/1227121/compare-object-instances-for-equality-by-their-attributes-in-python by cc-by-sa and MIT license