def __init__(self)

del是刪除一個對象,其實準確的說,應該是使該對象的引用計數減一。但是注意,並不是每次調用它的時候,del()就會調用,因爲__del__()是在該對象的引用計數降爲0時纔會被調用,示例爲證:


>>> class C:
        def __del__(self):
        print("I'm vanishing...")

>>> c = C()
>>> b = c            # 注意,此時對C()的引用計數爲2
>>> del b
>>>                  # 瞧,什麼輸出都沒有,說明__del__()並沒調用
>>> del c
I'm vanishing...     # 引用計數降爲0後才被調用
>>>

接下來理解這一點:
創建對象後,python解釋器默認調用__init__()方法。當刪除一個對象時,python解釋器也會默認調用一個方法,這個方法爲__del__()方法。在python中,對於開發者來說很少會直接銷燬對象(如果需要,應該使用del關鍵字銷燬)。Python的內存管理機制能夠很好的勝任這份工作。也就是說,不管是手動調用del還是由python自動回收都會觸發__del__方法執行:

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秒鐘後結束")
輸出:
__init__方法被調用
__del__方法被調用
哈皮狗對象馬上被幹掉了...
__init__方法被調用
---馬上 刪除cat對象
---馬上 刪除cat2對象
---馬上 刪除cat3對象
__del__方法被調用
波斯貓對象馬上被幹掉了...
程序2秒鐘後結束

接下來是理解python父類子類的del:
我們重寫子類的 del() 方法(父類爲非 object 的類),則必須顯式調用父類的 del() 方法,這樣才能保證在回收子類對象時,其佔用的資源(可能包含繼承自父類的部分資源)能被徹底釋放。爲了說明這一點,這裏舉一個反例:

class CLanguage:
    def __del__(self):
        print("調用父類 __del__() 方法")

class cl(CLanguage):
    def __del__(self):
        print("調用子類 __del__() 方法")
c = cl()
del c
輸出:
調用子類 __del__() 方法

簡單總結:
1.del會自動調用,自動回收。而且只有對象的引用計數-1後爲0才調用這個del()
2.父類子類裏面,刪除父類del,子類佔用父類資源纔會釋放而且不輸出子類的del(),而是輸出父類的del()

發佈了50 篇原創文章 · 獲贊 13 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章