Python對象中__del__方法起作用的條件詳解
對象的__del__是對象在被gc消除回收的時候起作用的一個方法,它的執(zhí)行一般也就意味著對象不能夠繼續(xù)引用。
示范代碼如下:
class Demo:
def __del__(self):
print("calling __del__")
obj = Demo()
del obj
程序執(zhí)行結果如下:
grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/02_programme_language/03_python/03_OOP/2017/08$python del_method.py calling __del__
但是,這并不是讓__del__執(zhí)行的唯一方式。其實,這個方法也可以直接調用。測試代碼如下:
class Demo:
def __init__(self):
print("calling __del__")
obj = Demo()
obj.__del__()
程序執(zhí)行結果:
grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/02_programme_language/03_python/03_OOP/2017/08$python del_method.py calling __del__
但是,這樣的執(zhí)行很多時候并不能夠保證垃圾回收的正常執(zhí)行。
如下代碼:
grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/02_programme_language/03_python/03_OOP/2017/08$python del_method.py calling __del__ calling __del__
執(zhí)行結果:
grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/02_programme_language/03_python/03_OOP/2017/08$python del_method.py calling __del__ calling __del__
推測:上面的刪除方法觸發(fā)了兩次刪除,但是由于引用關系,刪除銷毀其實沒有實現。
修改代碼驗證如下:
class Demo:
def __del__(self):
print("calling __del__")
del self
obj = Demo()
obj.__del__()
print(id(obj))
執(zhí)行結果:
grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/02_programme_language/03_python/03_OOP/2017/08$python del_method.py calling __del__ 140726800222040 calling __del__
從上面看來,其實主要還有對對象的引用,這個銷毀的動作還是需要等待對象引用沒有了以后才能夠完成。進一步驗證代碼:
class Demo:
def __del__(self):
print("calling __del__")
del self
obj = Demo()
obj.__del__()
print(id(obj))
print(id(obj))
執(zhí)行結果:
grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/02_programme_language/03_python/03_OOP/2017/08$python del_method.py calling __del__ 140568015406936 140568015406936 calling __del__
從上面結果看,猜測還是準確的。
以上這篇Python對象中__del__方法起作用的條件詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
shell命令行,一鍵創(chuàng)建 python 模板文件腳本方法
下面小編就為大家分享一篇shell命令行,一鍵創(chuàng)建 python 模板文件腳本方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03
Python3.6 Schedule模塊定時任務(實例講解)
下面小編就為大家?guī)硪黄狿ython3.6 Schedule模塊定時任務(實例講解)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11

