python __del__() 清空物件
阿新 • • 發佈:2020-11-16
python __del__() 清空物件
python垃圾回收機制:當一個物件的引用被完全清空之後,就會呼叫__del__()方法來清空這個物件
當物件的引用沒有被完全清空時,程式碼如下:
class C(): def __init__(self): print('呼叫構造器建立物件') def __del__(self): print('銷燬建立的物件') c1 = C() c2 = c1 c3 = c1 print('=====================================') print(str(id(c1)) +', '+ str(id(c2)) +' , '+ str(id(c3))) print('=====================================') del c1 del c2 # del c3 先保留c3,不完全刪除C()的引用 # print(c1) 不註釋的話會報錯:NameError: name 'c1' is not defined # print(c2) 不註釋的話會報錯:NameError: name 'c2' is not defined print(c3) # 輸出:<__main__.C object at 0x0000023444AF0AC0>print('=====================================') while True: time.sleep(2) print('迴圈中.......')
輸出結果: 下面的輸出結果裡面沒有顯示 “銷燬建立的物件”
呼叫構造器建立物件 ===================================== 2423513877184 , 2423513877184 , 2423513877184 ===================================== <__main__.C object at 0x0000023444AF0AC0> ===================================== 迴圈中....... 迴圈中....... 迴圈中....... 迴圈中.......
當物件的引用完全被清空時,程式碼如下:
class C(): def __init__(self): print('呼叫構造器建立物件') def __del__(self): print('銷燬建立的物件') c1 = C() c2 = c1 c3 = c1 print('=====================================') print(str(id(c1)) +' , '+ str(id(c2)) +' , '+ str(id(c3))) print('=====================================') del c1 del c2 del c3 #已經將物件的引用全部刪除,程式會自動呼叫 __del__方法 # print(c1) 不註釋的話會報錯:NameError: name 'c1' is not defined # print(c2) 不註釋的話會報錯:NameError: name 'c2' is not defined # print(c3) 不註釋的話會報錯:NameError: name 'c3' is not defined print('=====================================') while True: time.sleep(2) print('迴圈中.......')
輸出結果:
呼叫構造器建立物件 ===================================== 2873013504704 , 2873013504704 , 2873013504704 ===================================== 銷燬建立的物件 ===================================== 迴圈中....... 迴圈中....... 迴圈中....... 迴圈中.......