這篇文章將為大家詳細講解有關(guān)python3中構(gòu)造函數(shù)和析構(gòu)函數(shù)的區(qū)別,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

要點:
1、魔法方法,被__雙下劃線所包圍
在適當(dāng)?shù)臅r候自動被調(diào)用
2、在創(chuàng)建一個對象的時候,一定會調(diào)用構(gòu)造函數(shù)
3、 del析構(gòu)函數(shù),在del a對象的時候,并一定會調(diào)用該析構(gòu)函數(shù)
只有當(dāng)該對象的引用計數(shù)為0時才會調(diào)用析構(gòu)函數(shù),回收資源
析構(gòu)函數(shù)被python的垃圾回收器銷毀的時候調(diào)用。當(dāng)某一個對象沒有被引用時,垃圾回收器自動回收資源,調(diào)用析構(gòu)函數(shù)
#coding=utf-8
'''
魔法方法,被__雙下劃線所包圍
在適當(dāng)?shù)臅r候自動被調(diào)用
'''
#構(gòu)造init、析構(gòu)del
class Rectangle:
def __init__(self,x,y):
self.x = x
self.y = y
print('構(gòu)造')
'''
del析構(gòu)函數(shù),并不是在del a對象的時候就會調(diào)用該析構(gòu)函數(shù)
只有當(dāng)該對象的引用計數(shù)為0時才會調(diào)用析構(gòu)函數(shù),回收資源
析構(gòu)函數(shù)被python的垃圾回收器銷毀的時候調(diào)用。當(dāng)某一個對象沒有被引用時,垃圾回收器自動回收資源,調(diào)用析構(gòu)函數(shù)
'''
def __del__(self):
print('析構(gòu)')
def getPeri(self):
return (self.x + self.y)*2
def getArea(self):
return self.x * self.y
if __name__ == '__main__':
rect = Rectangle(3,4)
# a = rect.getArea()
# b = rect.getPeri()
# print(a,b)
rect1 = rect
del rect1
# del rect
while 1:
pass補充知識:Python 類成員變量使用缺省值初始化時要注意的一個坑
Python 類成員變量使用缺省值初始化時要注意的一個坑
標簽(空格分隔): python2.7 python 3.6
考慮到如下場景:
定義class A,class A 包含成員變量 l 和 d, l為數(shù)組, d 為字典;
在 class A 的構(gòu)造函數(shù)中使用缺省參數(shù)初始化 A 的成員變量 l 和 d ;
具體代碼如下:
class A:
def __init__(self, l=["name"], d={"key1": "test"}):
self.l = l
self.d = d現(xiàn)在,在主邏輯函數(shù)中定義生成多個 A 的實例, 構(gòu)造時使用構(gòu)造函數(shù)的缺省值:
if __name__ == "__main__": a1 = A() a2 = A() print (id(a1.l), id(a1.d)) print (id(a2.l), id(a2.d))
輸出的結(jié)果如下:
python2.7 (56305416L, 56376040L) (56305416L, 56376040L) python3.6 2036953558112 2036953558112
可以看出,使用缺省值初始化的2個 A 的實例中,對應(yīng)的成員變量 l 和 d 指向了同一個地址
現(xiàn)在假設(shè)需要在主邏輯函數(shù)中分別操作實例a1 和 a2:
if __name__ == "__main__":
a1 = A()
a2 = A()
# print (id(a1.l), id(a1.d))
# print (id(a2.l), id(a2.d))
a1.l.extend(["a", "b", "C", "Xa"])
a1.d["key"] = "value"
print ("a1", a1.l, a1.d)
print ("a2", a2.l, a2.d)輸出結(jié)果會如下:
a1 ['name', 'a', 'b', 'C', 'Xa'] {'key1': 'test', 'key': 'value'}
a2 ['name', 'a', 'b', 'C', 'Xa'] {'key1': 'test', 'key': 'value'}
只修改a1,但 a2 的成員變量同時也被改變了!
此問題實際場景中其中一個是在使用wxGride時會遇到:
class MyGrid(wx.grid.Grid): def __init__(self, parent, col_titles=["a", "b", "c"], data=[["1", "2", "3"]]): wx.grid.Grid__init__(self, parent=parent) self.col_titls = col_titles self.data = data ... def AppendData(self, rows=[], clear=Flase): self.data.extend(rows) msg = wx.grid.GridTableMessage(self, wx.grid.GRIDTABLE_NOTIFY_ROWS_DELETED, 0, len(rows)) self.ProcessTableMessage(msg) class MyFrame(wx.Frame): def __init(self, parent, title=""): wx.Frame.__init__(self, parent=parent, title=title) self.grid1 = MyGrid(self) self.grid2 = MyGrid(self) ... def onGridAddCallback(rows, force=False): if isinstance(rows, list) and len(rows) > 0: self.grid1.AppendData(rows, force)
當(dāng)更新gird1的內(nèi)容時,gird2的成員變量 data 也發(fā)生了改變,因此導(dǎo)致異常
可選的解決方案: 避免使用缺省值初始化指針類型成員變量(list, dict …):
class MyFrame(wx.Frame): def __init(self, parent, title=""): wx.Frame.__init__(self, parent=parent, title=title) self.grid1 = MyGrid(self, col_titles=["a", "b", "c"], data=[["1", "2", "3"]]) self.grid2 = MyGrid(self, col_titles=["a", "b", "c"], data=[["1", "2", "3"]]) ...
關(guān)于python3中構(gòu)造函數(shù)和析構(gòu)函數(shù)的區(qū)別就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章標題:python3中構(gòu)造函數(shù)和析構(gòu)函數(shù)的區(qū)別-創(chuàng)新互聯(lián)
標題URL:http://www.yijiale78.com/article48/cegoep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、微信公眾號、App開發(fā)、標簽優(yōu)化、Google、用戶體驗
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容