2016-09-29 4 views
1

__ne__이라는 마법 메서드가 Python에서 사용되었으므로 객체 !=과 비교하여 트리거됩니다.Python 2.7 __ne__이 정의되지 않은 경우 비교되는 내용

예 :

class A(object): 
    def __init__(self, a): 
     self.a = a 

    def __ne__(self, other): 
     return self.a != other.a 

A(3) != A(3) # produces False 
A(3) != A(2) # produces True 

[질문 :__ne__ 경우 후드 아래에 어떻게됩니까

가 정의되어 있지?

참고 : 파이썬 3.x !=에서 비교는 어떤 것이든 __eq__이 반환하는 것과 반전 된 것으로 정의됩니다.

이 경우 객체 ID를 비교 한 결과, 우리가 싱글 톤이 없다고 가정하면 모든 != 비교는 True을 반환해야합니다. 하지만 분명히 다른 환경에서 동일한 코드가 다른 결과를 산출하고 있었기 때문에 객체 ID 대신 비교되는 다른 것이 있다고 생각합니다.

답변

2

클래스 정의에 명시적인 __ne__을 사용하지 않으면 상속 된 object__ne__이 사용됩니다. 당신이 사용자 정의 클래스를 비교하고 있기 때문에, 다음 id를 사용하고 그래서

def __ne__(self, other): 
    eq_result = self == other 
    if eq_result is NotImplemented: 
     return NotImplemented 
    else: 
     return not eq_result 

: 그것은 (그러나 물론 원래는 C로 작성) 코드를 다음과 같이 작동합니다.

여기에 소스 코드 source code가 있습니다. slot_tp_richcompare을보십시오.

+0

어디에서 가져 왔습니까? 이 기능의 C 구현에 대한 링크가 있습니까? – vovaminiof

+0

@vovaminiof이 (가) 편집되었습니다. – turkus

1

turkus '대답은 정확합니다. __ne__() 메서드가 지정되어 있지 않으면 __eq__() 메서드 결과의 역함수가 반환됩니다. CPython의 소스의 중요한 부분이다 slot_tp_richcompare() : 정의되지

static PyObject * 
slot_tp_richcompare(PyObject *self, PyObject *other, int op) 
{ 
    PyObject *res; 

    if (Py_TYPE(self)->tp_richcompare == slot_tp_richcompare) { 
     res = half_richcompare(self, other, op); 
     if (res != Py_NotImplemented) 
      return res; 
     Py_DECREF(res); 
    } 
    if (Py_TYPE(other)->tp_richcompare == slot_tp_richcompare) { 
     res = half_richcompare(other, self, _Py_SwappedOp[op]); 
     if (res != Py_NotImplemented) { 
      return res; 
     } 
     Py_DECREF(res); 
    } 
    Py_INCREF(Py_NotImplemented); 
    return Py_NotImplemented; 
} 

__ne__() 경우 (Py_EQ_Py_SwappedOp[op]로서 정의, 즉 Py_NE위한 __eq__()) 대향 메소드가 호출된다. classobject.c에서 주석은 __eq__() 정의 할 수 없습니다해야 무슨 일을 보여줍니다이 더 __eq__하지 않고 __cmp__ 방법, 우리가 주소 해시하지

/*합니다. __eq__ 또는 __cmp__ 메서드가있는 경우 이 __hash__이어야합니다. */