python中的__del__()方法

函數中的 __del__()? 方法: 銷毀對象

Python通過調用__init__()方法構造當前類的實例化對象,而__del__()方法,是用來銷毀實例化對象。

事實上在編寫程序時,如果之前我們創(chuàng)建的類實例化對象后續(xù)不再使用,最好再合適位置手動將其銷毀,釋放其占用的內存空間(整個過程稱為垃圾回收(簡稱:GC))

大多數情況下,Python開發(fā)者不需要手動進行垃圾回收,因為Python有自動的垃圾回收機制,能將不需要使用的實例對象進行銷毀

(pycharm環(huán)境,python3.7.6)

實例一

# -*- coding:utf8 -*-classUser:

def__init__(self):

print("=== 調用 __init__() 方法構造對象 ===")

def__del__(self):

print("調用__del__() 銷毀對象,(對象占用的內存被回收)")

u1=User()

print('#'*50)

運行結果:

D:\pythonproject\venv\Scripts\python.exe D:/pythonproject/私有屬性2.py

=== 調用 __init__() 方法構造對象 ===

##################################################

調用__del__() 銷毀對象,(對象占用的內存被回收)

Process finished with exit code 0

注釋:上面代碼在交互式python下運行是不會調用__del__()方法的,也就不會打印出調用__del__() 銷毀對象,(對象占用的內存被回收)

結論:Python 會在程序即將結束前調用__del__方法,自動幫我們銷毀對象,進而釋放對象占用的內存,注意__del__()方法調用的位置,在print('#'*50)語句之后。

實例二

# -*- coding:utf8 -*-classUser:

def__init__(self):

print("=== 調用 __init__() 方法構造對象 ===")

def__del__(self):

print("調用__del__() 銷毀對象,(對象占用的內存被回收)")

u1=User()

delu1print('#'*50)

運行結果:

D:\pythonproject\venv\Scripts\python.exe D:/pythonproject/私有屬性2.py

=== 調用 __init__() 方法構造對象 ===

調用__del__() 銷毀對象,(對象占用的內存被回收)

##################################################

Process finished with exit code 0

結論:手動刪除對象,進而調用 __del__() 方法銷毀內存對象,釋放內存空間

實例三

# -*- coding:utf8 -*-classUser:

def__init__(self):

print("=== 調用 __init__() 方法構造對象 ===")

def__del__(self):

print("調用__del__() 銷毀對象,(對象占用的內存被回收)")

u1=User()

# 添加一個引用u1對象的實例對象u2=u1delu1#print('#'*50)

運行結果:

D:\pythonproject\venv\Scripts\python.exe D:/pythonproject/私有屬性2.py

=== 調用 __init__() 方法構造對象 ===

##################################################

調用__del__() 銷毀對象,(對象占用的內存被回收)

Process finished with exit code 0

結論:從運行結果可以看出來,執(zhí)行該語句 del u1 調用 __del__()方法,但是并沒有立即執(zhí)行,而是在程序即將運行結束的時候,程序自動調用了__del__()方法,銷毀了內存對象,這里涉及Python的垃圾回收機制

Python采用自動引用計數(簡稱:ARC(auto-refrence-count))的方式實現垃圾回收機制。該方法的核心思想是:每一個Python對象都會配置一個計數器,初始Python實例對象的計數器值都為0,如果有變量引用該實例對象,其計數器的值也會加1,依次類推;反之,每當一個變量取消對該實例對象的引用,計數器會減1。如果一個Python對象的計數器值為0,則表明沒有變量引用該Python對象,即證明程序不再需要它了,此時Python就會自動調用__del__()方法將其回收

以實例二為例:實際上構建u1實例對象的過程分為2步,先使用User()調用該類中的__init__()方法構造出一個該類的對象(我們將其稱為U,計數器為0),并立即用 u1 這個變量作為所建實例對象的引用 (U 的計數器值 + 1)。在此基礎上,又有一個 u2 變量引用 u1(其實相當于引用User(),此時U的計數器再 +1),這時如果調用 del u1 語句,只會導致 C 的計數器減 1(值變?yōu)?),因此C的計數器值不為0,因此U不會被銷毀(不會執(zhí)行 __del__() 方法)。

實例四 1.0

# -*- coding:utf8 -*-classUser:

def__init__(self):

print("=== 調用 __init__() 方法構造對象 ===")

def__del__(self):

print("調用__del__() 銷毀對象,(對象占用的內存被回收)")

u1=User()

u2=u1# del u1 # 從運行結果可以看出來,執(zhí)行該語句沒有調用 __del__()方法,而是在程序即將運行結束的時候,程序自動調用了__del__()方法,銷毀了對象# print('#'*50)# print('\n')# del u2# print("*"*50)

運行結果:

D:\pythonproject\venv\Scripts\python.exe D:/pythonproject/私有屬性2.py

===調用 __init__() 方法構造對象===調用__del__() 銷毀對象,(對象占用的內存被回收)

Process finished withexitcode0

實例四 1.1:

# -*- coding:utf8 -*-classUser:

def__init__(self):

print("=== 調用 __init__() 方法構造對象 ===")

def__del__(self):

print("調用__del__() 銷毀對象,(對象占用的內存被回收)")

u1=User()

u2=u1delu1# 從運行結果可以看出來,執(zhí)行該語句沒有調用 __del__()方法,而是在程序即將運行結束的時候,程序自動調用了__del__()方法,銷毀了對象print('#'*50)

# print('\n')# del u2print("*"*50)

運行結果:

D:\pythonproject\venv\Scripts\python.exe D:/pythonproject/私有屬性2.py

=== 調用 __init__() 方法構造對象 ===

##################################################

**************************************************

調用__del__() 銷毀對象,(對象占用的內存被回收)

Process finished with exit code 0

實例四 1.2:

# -*- coding:utf8 -*-classUser:

def__init__(self):

print("=== 調用 __init__() 方法構造對象 ===")

def__del__(self):

print("調用__del__() 銷毀對象,(對象占用的內存被回收)")

u1=User()

u2=u1delu1# 從運行結果可以看出來,執(zhí)行該語句沒有調用 __del__()方法,而是在程序即將運行結束的時候,程序自動調用了__del__()方法,銷毀了對象print('#'*50)

print('\n')

delu2print("*"*50)

運行結果:

D:\pythonproject\venv\Scripts\python.exe D:/pythonproject/私有屬性2.py

=== 調用 __init__() 方法構造對象 ===

##################################################

調用__del__() 銷毀對象,(對象占用的內存被回收)

**************************************************

Process finished with exit code 0

通過以上三個實例對比,我們不難發(fā)現:實例對象被引用了n次,計數器就為n,執(zhí)行一次del 對象的引用那么所引用的這個實例對象的計數器就會自動減1,當實例對象的計數器減為零時,就會調用并且執(zhí)行類中的__del__()方法,計數器不為零,則不會執(zhí)行實例對象中的__del__()方法,那么就會等程序即將結束之前,python解釋器會自動執(zhí)行__del__()方法,銷毀對象。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容