魔法方法
1、python中的魔法方法總是被雙下劃線__包圍,比如:__init__();
2、魔法方法的魔法就體現在他們會在需要的時候被自動調用。
構造函數與析構函數
構造函數
1、用於初始化類的內部狀態,python提供的類構造函數__init__()與__new__();
2、__init__():__init__()方法是可選的,如果沒有定義,則使用默認的__init__()方法;
3、__new__():__new__()方法也是可選的,而且平時也很少去重寫他,只有當繼承一個不可變類型的時候,纔會對其進行重寫。
析構函數
1、用於回收對象的資源,python提供的析構函數__del__();
2、__del__()函數也是可選的,如果沒有定義,python會在後臺提供默認的析構函數;
3、如果要顯式的調用析構函數,可以使用del關鍵字。
__init__()
構造函數,用於初始化類內部的狀態,初始化實例對象,返回值只能爲None
>>> class Rectangle:
"""
定義一個矩形類,
需要長和寬兩個參數,
擁有計算周長和麪積兩個方法。
需要對象在初始化的時候擁有“長”和“寬”兩個參數,
因此我們要重寫__init__()方法,因爲__init__()方法是類在實例化成對象的時候
首先調用的一個方法。
"""
def __init__(self, x, y):
self.x = x
self.y = y
def getPeri(self):
# 計算周長
return (self.x + self.y) * 2
def getArea(self):
# 計算面積
return self.x * self.y
>>> rect = Rectangle(3, 4)
>>> # 得到周長
>>> rect.getPeri()
14
>>> # 得到面積
>>> rect.getArea()
12
我個人覺得這樣來說比較明白一點,在一個類中,定義了不同的方法,而這些方法都要用到同一組屬性,這樣,我們就可以重寫__init__()方法,在初始化實例對象的時候直接將該組屬性與實例對象綁定,然後就可以帶着該組屬性去調用不同的方法,得到不同的結果。
__new__()
其實,在一個對象被實例化的時候,調用的第一個方法並不是init,而是new方法,new方法返回一個該類的實例對象,new方法跟其他的方法不同,他的第一個參數不是self,而是這個類(cls),其他的參數都會傳遞給init方法,平時一般很少重寫new方法,讓python用默認方案執行就可以了,除非你是繼承了一個不可變類型,比如說(str、tuple、list)等等,new方法就顯得很重要了:
>>> class CapStr(str):
# 繼承不可變類型str,重寫__new__()
def __new__(cls, string):
string = string.upper()
# 我們只重寫我們需要的內容,其他的一切都交給python的默認機制來完成就行
return str.__new__(cls, string)
>>> a = CapStr("I'm spiderman")
>>> a
"I'M SPIDERMAN"
__del__()
__del__()方法是python的析構器,在一個對象將要被銷燬時調用,並不是使用了del關鍵字,這個方法就會被調用,而是在一個對象的引用計數爲0的時候,也就是垃圾回收機制要回收這個對象的時候,__del__()方法纔會被調用。
>>> class A:
def __init__(self):
print('我是__init__方法,我正在被調用....')
def __del__(self):
print('我是__del__方法,我正在被調用....')
>>> a1 = A()
我是__init__方法,我正在被調用....
>>> a2 = a1 # a1的引用計數+1
>>> a3 = a2 # a1的引用計數+1
>>> del a3 # a1的引用計數-1
>>> del a2 # a1的引用計數-1
>>> del a1 # a1的引用計數-1,此刻a1的引用計數爲0,調用__del__()方法
我是__del__方法,我正在被調用....