Python 的對象天生擁有一些神奇的方法,它們總被雙下劃線所包圍,它們是面向對象的 Python 的一切。它們是可以給你的類增加魔力的特殊方法,如果你的對象實現(重載)了某一個魔法方法,那麼這個方法就會在特殊的情況下自動被 Python 所調用。
析構器,定義對象在內存中被釋放時的行為。
self 代表對象本身,也可以有其他參數。
Python自帶垃圾回收機制,但它只能回收用戶級資源,而不能自動回收系統資源。故當一個對象同時擁有用戶級(Python程序)與內核級(系統)兩種資源時,就必須在清除對象的同時回收系統資源(如關閉文件等),這就用到了__del__方法。
__del__
方法是當對象被系統回收的時候調用的魔法方法,在對象生命周期調用結束時調用該方法。
Python 采用自動引用計數(ARC)方式來回收對象所占用的空間,當程序中有一個變量引用該 Python 對象時,Python 會自動保證該對象引用計數為 1;當程序中有兩個變量引用該 Python 對象時,Python 會自動保證該對象引用計數為 2,依此類推,如果一個對象的引用計數變成了 0,則說明程序中不再有變量引用該對象,表明程序不再需要該對象,因此 Python 就會回收該對象。所以大部分時候,都不需要我們手動去刪掉不再使用的對象,python的回收機制會自動幫我們做這件事。
示例代碼:
class A(object):
def __init__(self, a):
print('this is A init')
self.a = a
def __del__(self):
print('this is magic method del')
m = A(1)
運行結果:
this is A init
this is magic method del
class MyText(object):
def __init__(self, file_name):
self.file_name = file_name
def __del__(self):
self.file_name.close()
del self.file_name
print('我被回收了哦')
sample = MyText(open('b.txt', 'a'))
print('1234', file=sample.file_name)
sample1 = sample
del sample
print('----------')
執行結果:
----------
我被回收了哦
1、並不是對一個變量執行 del 操作,該變量所引用的對象就會被回收,只有當對象的引用計數變成 0 時,該對象才會被回收。
2、如果父類提供了 __del__方法,則子類重寫 __del__方法時必須顯式調用父類的 __del__方法,這樣才能保證合理地回收父類實例的部分屬性。