91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python類對象的析構釋放怎么實現

發布時間:2022-09-09 09:44:26 來源:億速云 閱讀:166 作者:iii 欄目:編程語言

這篇“python類對象的析構釋放怎么實現”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“python類對象的析構釋放怎么實現”文章吧。

一、類的構造函數與析構函數

  • _init__ 函數是python 類的構造函數,在創建一個類對象的時候,就會自動調用該函數;可以用來在創建對象的時候,設置該對象的一些初始化信息和設置。

  • __del__ 函數是python 類的析構函數,在一個類對象生命周期結束、被銷毀的時候,就會自動調用該函數;主要用來釋放對象占用的一些資源等。

二、代碼演示

1. 引用的更迭

如下,編寫了一個 demo 類的實現代碼。

>>> class demo():
...     def __init__(self):
...             print("init class")
...             print(self)
...     def __del__(self):
...             print("del class")
...             print(self)
... 
>>>

該類對象在創建的時候,會調用 __init__函數,打印出 “init class”;
該類對象在銷毀的時候,會調用 __del__函數,打印出 “del class”。

>>> a1 = demo()
init class
<__main__.demo instance at 0x7f328f7c6cb0>
>>> 
>>> a2 = demo()  
init class
<__main__.demo instance at 0x7f328f7c6d40>
>>> 
>>> 
>>> 
>>> a1 = demo()
init class
<__main__.demo instance at 0x7f328f7c6d88>
del class
<__main__.demo instance at 0x7f328f7c6cb0>
>>>

首先使用變量 a1 引用一個 demo 類對象,此時打印出"init class",以及a1 變量所引用的對象地址 0x7f328f7c6cb0

使用變量 a2 引用另外的一個 demo 類對象,此時打印出"init class",以及a2 變量所引用的對象地址 0x7f328f7c6d40

a1 和 a2 變量所引用的類對象是不同的兩個對象 0x7f328f7c6cb00x7f328f7c6d40

最后創建一個 demo 類對象,再次使用 a1 變量來指向,此時 a1 引用了新的類對象,引用地址為 0x7f328f7c6d88;同時,由于之前 a1 引用的對象0x7f328f7c6cb0 不再有人引用它,因此舊的 demo 類對象的空間被釋放,打印出了 “del class 0x7f328f7c6cb0”。

2. 只在函數內部的類對象

>>> def create_demo():
...     inst = demo()
... 
>>> create_demo()
init class
<__main__.demo instance at 0x7f328f7c6cb0>
del class
<__main__.demo instance at 0x7f328f7c6cb0>
>>> 
>>> 
>>> 
>>> create_demo()
init class
<__main__.demo instance at 0x7f328f7c6cb0>
del class
<__main__.demo instance at 0x7f328f7c6cb0>
>>> 
>>> 
>>> 
>>> create_demo()
init class
<__main__.demo instance at 0x7f328f7c6cb0>
del class
<__main__.demo instance at 0x7f328f7c6cb0>
>>>

定義一個函數 create_demo,該函數的作用是創建一個 demo 類對象,并且使用 inst 變量來引用創建的類對象。

調用一次 create_demo() 函數,可以看到,demo 對象被創建,地址為 0x7f328f7c6cb0;接著該 demo 對象立即被釋放;因為該對象只在 create_demo 函數范圍內有效,函數結束,demo 對象就被回收釋放。

再調用一次 create_demo() 函數,現象相同:demo 對象被創建,地址為 0x7f328f7c6cb0;接著該 demo 對象立即被釋放。

三、函數內部返回的類對象

>>> def return_demo():
...     return demo()
...

定義函數 return_demo,該函數內部創建類對象,并且返回創建出的類對象。

>>> True
True
>>> return_demo()
init class
<__main__.demo instance at 0x7fc511eb8cb0>
<__main__.demo instance at 0x7fc511eb8cb0>
>>> 
>>> True
del class
<__main__.demo instance at 0x7fc511eb8cb0>
True
>>> 
>>> return_demo()
init class
<__main__.demo instance at 0x7fc511eb8cb0>
<__main__.demo instance at 0x7fc511eb8cb0>
>>> 
>>> 
>>> 
>>> True
del class
<__main__.demo instance at 0x7fc511eb8cb0>
True
>>> 
>>>

可以看到,第一次調用函數 return_demo(),打印的內容顯示,此時創建了一個對象,對象地址為 0x7fc511eb8cb0;函數 return_demo 內部使用 return 語句返回創建的類對象,因此函數返回時,不會釋放對象 0x7fc511eb8cb0

接著,執行一條 Python 語句:True,同時看到對象 0x7fc511eb8cb0 被釋放。因為程序執行完 return_demo() 函數之后,發現后面的程序并沒有引用 return_demo() 返回的對象,因此 Python 便會釋放對象空間 0x7fc511eb8cb0

第二次執行相同的操作,可以看到現象相同。

>>> v1_demo = None
>>> v2_demo = None 
>>> print(v1_demo)
None
>>> print(v2_demo)
None
>>> True
True
>>> 
>>> v1_demo = return_demo() 
init class
<__main__.demo instance at 0x7fc511eb8d88>
>>> 
>>> print(v1_demo)
<__main__.demo instance at 0x7fc511eb8d88>
>>> 
>>> True
True
>>> 
>>> 
>>> v2_demo = return_demo()  
init class
<__main__.demo instance at 0x7fc511eb8dd0>
>>> 
>>> print(v2_demo)
<__main__.demo instance at 0x7fc511eb8dd0>
>>> True
True
>>> 
>>> 
>>> 
>>> 
>>> v1_demo = None
del class
<__main__.demo instance at 0x7fc511eb8d88>
>>> 
>>> print(v1_demo)
None
>>>

該代碼段的現象和上個代碼段的現象基本相同。

可以看到,v1_demo 和 v2_demo 引用了類對象,所以 v1_demo 和 v2_demo 的值不再是 None

最后,我們讓 v1_demo 重新為 None。此時,v1_demo 引用的對象 0x7fc511eb8d88 就被釋放了。

1. 使用全局變量 引用 函數內部的類對象

>>> g_demo = None
>>> print(g_demo)
None
>>> 
>>> def return_gdemo():    
...     global g_demo
...     g_demo = demo()
... 
>>> 
>>> print(g_demo)
None
>>> return_gdemo()
init class
<__main__.demo instance at 0x7fc511eb8d88>
>>> 
>>> print(g_demo)
<__main__.demo instance at 0x7fc511eb8d88>
>>> 
>>> True
True
>>>

以上就是關于“python類對象的析構釋放怎么實現”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

张家川| 贞丰县| 象山县| 纳雍县| 易门县| 浏阳市| 林西县| 浑源县| 旺苍县| 泰兴市| 巩留县| 宝应县| 广汉市| 昌江| 宿迁市| 芒康县| 交口县| 宁德市| 桑植县| 惠来县| 平原县| 富顺县| 乡城县| 黄龙县| 易门县| 凌云县| 永州市| 河间市| 玉环县| 临洮县| 内乡县| 瑞金市| 阿瓦提县| 略阳县| 陆河县| 金山区| 达日县| 阳东县| 三河市| 水富县| 晋中市|