2014-01-29 5 views
0

가 그때 나는 같은 표현을 사용할 수있는 이유는 두 셀은, a와 b 객체가 셀 클래스파이썬 클래스의 메소드는 어떻게 작동합니까?

class Cell : 
    def __init__(self,char): 
     self.char=char 
     self.image='_' 

    def __str__(self): 
     return self.image 

    def __eq__(self,other): 
     return self.image == other.image 

    def __ne__(self,other): 
     return not self.image == other.image 

이 "만약 A = B :!"이 두 개체를 비교합니다. b가 어떻게 내부에 들어가고 eq이라는 방법으로 전화를 걸면 비교가 이루어지지 않습니다.

답변

1

b이 들어 가지 않습니다. 연산자가 사용되면, 파이썬은 먼저 왼쪽 인자에서 마법 메소드를 찾는다. 적절한 마법 메서드가 정의되어 있으면 호출됩니다. NotImplemented를 반환하지 않으면 그 결과입니다. 메서드가 존재하지 않으면 (또는 NotImplemented를 반환하는 경우) 마법 메서드가 오른쪽 인수에서 호출됩니다. (산술 연산자의 경우 오른쪽 인수는 __radd__이 오른쪽 버전 인 pf __add__, __rsub____sub__ 등입니다.

따라서 버전에 따라 a__ne__이 호출되며 그게 전부입니다. 마술 방법은 b에 결코 부르지 않는다.

이 동작은 the documentation에 설명되어 있습니다.

0

라고 대답하면 if a == bif a.__eq__(b)과 같습니다.

마찬가지로 if a != b을 말하면 실제로는 if a.__ne__(b)입니다. 두 메소드 모두 부울 값을 반환합니다.

각 클래스는 평등과 비항 등을 비교하기위한 기본 특수 메서드를 상속하지만 명시 적으로 정의 된 경우 이러한 메서드를 재정의 할 수 있습니다.

0

다른 답변이 적절한 답변입니다.

__ne__에는 우선 순위와 관련된 버그가 있습니다.

return not (self == other)

Don't Repeat Yourself :

return not (self.image == other.image)

가장 같이 표현된다 :과 같이 정의한다.

관련 문제