零基礎入門學習Python(21):魔法方法(1)構造和析構
從這節開始,我們介紹下Python的魔法方法:魔法方法總是被雙下劃線包圍。
之前有提到過初始化的魔法方法__init__()
,它返回None,在類定義時有時寫__init__()
方法,有時不寫,只有當我們需要對一個對象進行初始化操作時,纔會重寫__init__()
方法。
>>> class Rectangle:
def __init__(self,x,y): #默認是沒有參數的,但這裏需要傳入兩個參數,即需求,所以重寫了__init__方法
self.x = x
self.y = y
def area(self):
return self.x * self.y
>>> rect = Rectangle(2,3)
>>> rect.area()
6
下面介紹另一個初始化的魔法方法,實際上,下面這個魔法方法纔是創建對象時第一個要調用的方法:
__new__(cls[, ...])
: 是對象實例化的時候所調用的第一個方法,它第一個參數是 class ,後面有其他參數時,會原封不動的傳給__init__()
方法,很少被重寫。
1)需要一個實例對象作爲返回值;
2)當繼承一個不可變類型,又需要進行修改的時候,重寫
>>> class SortedList(list): #繼承列表,list是不可修改的
def __new__(cls, list1): #傳入一個列表list1
list1 = list.sort(list1) #調用列表的內置方法sort(),把list1重寫之後,讓list調用
return list.__new__(cls,list1) #返回一個實例對象
>>> l = SortedList([3,4,2,8,6,10,3,5])
>>> l #重寫之後,直接調用就可以得到排序之後的列表
[2, 3, 3, 4, 5, 6, 8, 10]
最後再介紹一下Python中的析構器:
__del__(self)
: 析構器,對象生成之後,當所有對它的引用都被 del 之後,會啓動垃圾回收機制,當垃圾回收機制銷燬對象的時候,就會調用這個方法。
>>> class Test:
def __init__(self):
print(' I am __init__ method, I am being called...')
def __del__(self):
print(' I am __del__ method, I am being called...')
>>> c1 = C() #生成一個實例化對象c1,調用了__init__()方法
I am __init__ method, I am being called...
>>> c2 = c1 #c2也指向c1這個對象的內存
>>> c3 = c2 #c3也指向c1這個對象的內存,即此時有3個名字指向同一塊內存區域
>>> del c3
>>> del c2
>>> del c1 #刪除出c3、c2、c1之後,沒有名字再指向這個內存了,所以就自動調用了__del__魔法方法來銷燬這個對象
I am __del__ method, I am being called...