原文連結:http://www.pythonclub.org/python-class/special-function
一般說來,特殊的方法都被用來模仿某個行為。例如,如果你想要為你的類使用x[key]這樣的索引操作(就像列表和元組一樣),那麼你只需要實現getitem()方法就可以了。想一下,Python就是對list類這樣做的!
下面這個表中列出了一些有用的特殊方法。如果你想要知道所有的特殊方法,你可以在《Python參考手冊》中找到一個龐大的列表。
==============================================================================
名稱 說明
---------------------------------------------------------
__init__(self,...) 這個方法在建立對象恰好要被返回使用之前被調用。
__del__(self) 恰好在對象要被刪除之前調用。
__str__(self) 在我們對對象使用print語句或是使用str()的時候調用。
__lt__(self,other) 當使用 小於 運算子(<)的時候調用。類似地,對於所有的運算子(+,>等等)都有特殊的方法。
__getitem__(self,key) 使用x[key]索引操作符的時候調用。__len__(self) 對序列對象使用內建的len()函數的時候調用。
__repr__(self) repr() and `...` conversions
__cmp__(self, o) Compares s to o and returns <0, 0, or >0. Implements >, <, == etc...
__hash__(self) 計算32位hash值,在set和dict中用到
__eq__(self,other) 比較兩個對象是否相等,在set和dict中用到
__nonzero__(self) Returns 0 or 1 for truth value testing__getattr__(self, name) called when attr lookup doesn't find <name>
__setattr__(self, name, val) called when setting an attr (inside, don't use "self.name = value" use "self.__dict__[name] = val")
__delattr__(self, name) called to delete attr <name>__call__(self, *args) called when an instance is called as function.
==============================================================================、
其中,對於set和dict來講,很重要的兩個方法是 __hash__(self) 和 __eq__(self,other)
這兩個方法跟Java中的Object.hashCode()和Object.equals()方法類似,如果要使兩個內容相等的對象被判定為equal,就必須重載這兩個函數,如下:
class Point: x=-1 y=-1 def __init__(self,x,y): self.x=x self.y=y def __hash__(self): return hash(self.x)^hash(self.y) def __eq__(self, other): return isinstance(other, self.__class__) and self.x == other.x and self.y == other.y
判斷一個Point類型的p是否在集合中,該判斷會去重:
if p not in set: #do something