python的__del__()方法
阿新 • • 發佈:2018-11-22
建立物件後,Python直譯器預設呼叫__init__()方法。當刪除一個物件時,Python直譯器也會預設呼叫一個方法,這個方法為__del__()方法。在Python中,對於開發者來說很少會直接銷燬物件(如果需要,應該使用del關鍵字銷燬)。Python的記憶體管理機制能夠很好的勝任這份工作。也就是說,不管是手動呼叫del還是由Python自動回收都會觸發__del__方法執行。
1. 建立多個物件的時候觸發__del__方法
Python直譯器釋放例項物件的時候,呼叫該物件的__del__方法
各個物件被被Python直譯器釋放物件的時候呼叫__del__方法
class Person(object): def __init__(self,name): self.name = name def __del__(self): print("例項物件:%s"%self.name,id(self)) print("python直譯器開始回收%s物件了"% self.name) print("類物件",id(Person)) zhangsan = Person("張三") print("例項物件張三:",id(zhangsan)) print("------------") lisi = Person("李四") print("例項物件李四:",id(lisi))
執行效果
2. 使用del刪除引用時的呼叫情況
當使用del 把記憶體的所有應用刪除,立刻呼叫__del__方法
執行效果
建立物件後,Python直譯器預設呼叫__init__()方法;
當刪除一個物件時,python直譯器也會預設呼叫一個方法,這個方法為__del__()方法
3. 建立多個例項物件並且刪除
import time class Animal(object): # 初始化方法 # 建立完物件後會自動被呼叫 def __init__(self, name): print('__init__方法被呼叫') self.__name = name # 析構方法 # 當物件被刪除時,會自動被呼叫 def __del__(self): print("__del__方法被呼叫") print("%s物件馬上被幹掉了..."%self.__name) # 建立物件 dog = Animal("哈皮狗") # 刪除物件 del dog cat = Animal("波斯貓") cat2 = cat cat3 = cat print("---馬上 刪除cat物件") del cat print("---馬上 刪除cat2物件") del cat2 print("---馬上 刪除cat3物件") del cat3 print("程式2秒鐘後結束") time.sleep(2)
結果:
4. 測量對應引用個數
5. 小結
當有1個變數儲存了物件的引用時,此物件的引用計數就會加1。
當使用del刪除變數指向的物件時,如果物件的引用計數不會1,比如3,那麼此時只會讓這個引用計數減1,即變為2,當再次呼叫del時,變為1,如果再呼叫1次del,此時會真的把物件進行刪除
注意
del xxx 不會主動呼叫__del__方法,只有引用計數 == 0時,__del__()才會被執行,並且定義了__del_()的例項無法被Python的迴圈垃圾收集器收集,所以儘量不要自定義__del__()。一般情況下,__del__() 不會破壞垃圾處理器。