python的del 第四天(關鍵字和__del__()方法)

python的__del__()方法

創建對象後,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))
執行效果

  1. 使用del刪除引用時的調用情況
    當使用del 把內存的所有應用刪除,立刻調用__del__方法

執行效果

創建對象後,Python解釋器默認調用__init__()方法;

當刪除一個對象時,python解釋器也會默認調用一個方法,這個方法爲__del__()方法

  1. 創建多個實例對象並且刪除

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)
結果:

  1. 測量對應引用個數

  2. 小結
    當有1個變量保存了對象的引用時,此對象的引用計數就會加1。

當使用del刪除變量指向的對象時,如果對象的引用計數不會1,比如3,那麼此時只會讓這個引用計數減1,即變爲2,當再次調用del時,變爲1,如果再調用1次del,此時會真的把對象進行刪除

注意
del xxx 不會主動調用__del__方法,只有引用計數 == 0時,del()纔會被執行,並且定義了__del_()的實例無法被Python的循環垃圾收集器收集,所以儘量不要自定義__del__()。一般情況下,del() 不會破壞垃圾處理器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章