class TT: def __init__(self): print "__init__" def __call__(self): print "__call__" def __str__(self): return "__str__" def __int__(self): return "__int__" def __add__(self,other): return "__add__" def __sub__(self,other): return "__sub__" def __mul__(self,other): return "__mul__" def __div__(self,other): return "__div__"
def __del__(self): print "析構函數被調用"
在Python中,定義一個類TT如上,那么
- 執行 obj = TT()方法,將自動調用TT中的 __init__ 方法
- 在執行obj() 或者TT()(),即類成員后加括號方式調用,則會自動調用 __call__ 方法
- 如果要將對象轉換為int類型,即ret = int(obj)則會自動調用類的 __int__ 方法,並將返回值賦值給左邊變量
- 同樣如果需要將對象轉換為str類型,即ret = str(obj)則會自動調用類的 __str__方法,並將返回值賦值給左邊變量
- 調用print(obj)方法,等同於調用print(str(obj))方法,最終也會調用到類的 __str__方法
- 兩個對象相加時候,則會自動調用第一個對象的 __add__方法,並將第一個個對象當做參數傳入這個方法中,同理還有 __sub__、__mul__、__div__
- 析構函數,即__del__,在對象銷毀的時候自動調用
- obj.__dict__,會將obj對象中的成員以詞典方式展示出來;TT.__dict__會將類中的成員以詞典方式展示出來
- 如果想要像列表那樣通過li[0]、li[1] = 10、del li[0]的方式訪問自己定義的類,需要分別實現__getitem__,__setitem__、__delitem__
def __getitem__(self,item): return XXX def __setitem__(self,item,value) pass def __delitem__(self,item): pass
如下所示:
obj = TT() # __init__ obj() # __call__ print(int(obj)) # __int__ print(str(obj)) # __str__ print(obj) # __str__ print(obj+50) # __add__ print(obj-50) # __sub__ print(obj*50) # __mul__ print(obj/50) # __div__ del obj # 析構函數被調用
對於python中可迭代對象,執行for循環時候,內部執行邏輯:
- 調用可迭代對象的__iter__方法,並獲取其返回值
- 循環上一步獲取的值
因此,如果需要我們自定義的對象可迭代,則需要實現__iter__(返回值需要為可迭代對象)。
