1. 程式人生 > 實用技巧 >python __del__() 清空物件

python __del__() 清空物件

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
=====================================
銷燬建立的物件
=====================================
迴圈中.......
迴圈中.......
迴圈中.......
迴圈中.......