1. 程式人生 > >python的__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))

執行效果

 

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__() 不會破壞垃圾處理器。