淺談python3 構(gòu)造函數(shù)和析構(gòu)函數(shù)
要點(diǎn):
1、魔法方法,被__雙下劃線所包圍
在適當(dāng)?shù)臅r(shí)候自動(dòng)被調(diào)用
2、在創(chuàng)建一個(gè)對(duì)象的時(shí)候,一定會(huì)調(diào)用構(gòu)造函數(shù)
3、 del析構(gòu)函數(shù),在del a對(duì)象的時(shí)候,并一定會(huì)調(diào)用該析構(gòu)函數(shù)
只有當(dāng)該對(duì)象的引用計(jì)數(shù)為0時(shí)才會(huì)調(diào)用析構(gòu)函數(shù),回收資源
析構(gòu)函數(shù)被python的垃圾回收器銷毀的時(shí)候調(diào)用。當(dāng)某一個(gè)對(duì)象沒(méi)有被引用時(shí),垃圾回收器自動(dòng)回收資源,調(diào)用析構(gòu)函數(shù)
#coding=utf-8
'''
魔法方法,被__雙下劃線所包圍
在適當(dāng)?shù)臅r(shí)候自動(dòng)被調(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對(duì)象的時(shí)候就會(huì)調(diào)用該析構(gòu)函數(shù)
只有當(dāng)該對(duì)象的引用計(jì)數(shù)為0時(shí)才會(huì)調(diào)用析構(gòu)函數(shù),回收資源
析構(gòu)函數(shù)被python的垃圾回收器銷毀的時(shí)候調(diào)用。當(dāng)某一個(gè)對(duì)象沒(méi)有被引用時(shí),垃圾回收器自動(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
補(bǔ)充知識(shí):Python 類成員變量使用缺省值初始化時(shí)要注意的一個(gè)坑
Python 類成員變量使用缺省值初始化時(shí)要注意的一個(gè)坑
標(biāo)簽(空格分隔): python2.7 python 3.6
考慮到如下場(chǎng)景:
定義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ù)中定義生成多個(gè) A 的實(shí)例, 構(gòu)造時(shí)使用構(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個(gè) A 的實(shí)例中,對(duì)應(yīng)的成員變量 l 和 d 指向了同一個(gè)地址
現(xiàn)在假設(shè)需要在主邏輯函數(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é)果會(huì)如下:
a1 ['name', 'a', 'b', 'C', 'Xa'] {'key1': 'test', 'key': 'value'}
a2 ['name', 'a', 'b', 'C', 'Xa'] {'key1': 'test', 'key': 'value'}
只修改a1,但 a2 的成員變量同時(shí)也被改變了!
此問(wèn)題實(shí)際場(chǎng)景中其中一個(gè)是在使用wxGride時(shí)會(huì)遇到:
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)容時(shí),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"]])
...
以上這篇淺談python3 構(gòu)造函數(shù)和析構(gòu)函數(shù)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決python3 json數(shù)據(jù)包含中文的讀寫問(wèn)題
今天小編就為大家分享一篇解決python3 json數(shù)據(jù)包含中文的讀寫問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
python中使用zip函數(shù)出現(xiàn)<zip object at 0x02A9E418>錯(cuò)誤的原因
這篇文章主要介紹了python中使用zip函數(shù)出現(xiàn)<zip object at 0x02A9E418>錯(cuò)誤的原因分析及解決方法,需要的朋友可以參考下2018-09-09
python基礎(chǔ)之類型轉(zhuǎn)換函數(shù)
這篇文章主要介紹了python類型轉(zhuǎn)換函數(shù),實(shí)例分析了Python中返回一個(gè)返回值與多個(gè)返回值的方法,需要的朋友可以參考下2021-10-10
Python爬蟲基礎(chǔ)之爬蟲的分類知識(shí)總結(jié)
來(lái)給大家講python爬蟲的基礎(chǔ)啦,首先我們從爬蟲的分類開始講起,下文有非常詳細(xì)的知識(shí)總結(jié),對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05
Python實(shí)現(xiàn)Wordcloud生成詞云圖的示例
這篇文章主要介紹了Python實(shí)現(xiàn)Wordcloud生成詞云圖的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
python實(shí)現(xiàn)監(jiān)控指定進(jìn)程的cpu和內(nèi)存使用率
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)監(jiān)控指定進(jìn)程的cpu和內(nèi)存使用率,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

