2014-01-29 34 views
0

我有一個Cell類python類特定方法如何工作?

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 

然後我有兩個Cell對象a和b,爲什麼我可以使用類似的表達:「如果A = B:」來比較這兩個對象。 b如何進入a並調用eq方法進行比較

回答

1

b不進去。當使用操作符時,Python首先在左側參數中查找魔術方法。如果在那裏定義了適當的魔術方法,它就會被調用。如果它不返回NotImplemented,那就是結果。如果該方法不存在(或者它返回NotImplemented),則在右側參數上調用魔術方法。 (對於算術運算符,右邊的參數得到一個單獨的方法,__radd__是右邊的版本,對於__sub__等,右邊的版本是__add__,__rsub__)。

因此,在您的版本中,它調用__ne__a就是這樣。神奇的方法從未被呼籲b

此行爲在the documentation中描述。

0

說出if a == b相當於if a.__eq__(b)

同樣,說if a != b真的是if a.__ne__(b)。這兩個方法都返回布爾值。

每個類都繼承了用於比較等式和不等式的默認特殊方法,但是如果明確定義,則可以重寫這些方法。

0

其他答案是正確的答案。

我只想提到__ne__有一個與優先級有關的錯誤。

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

這是最好的表現爲:

return not (self == other)

Don't Repeat Yourself,因爲它應該被定義。