Heim  >  Artikel  >  Backend-Entwicklung  >  Detailliertes Beispiel für die Zerstörung und Freigabe von Python-Klassenobjekten

Detailliertes Beispiel für die Zerstörung und Freigabe von Python-Klassenobjekten

WBOY
WBOYnach vorne
2022-09-08 17:37:282299Durchsuche

【Verwandte Empfehlung: Python3-Video-Tutorial

1. Konstruktor und Destruktor der Klasse

  • _init__ Funktion ist der Konstruktor der Python-Klasse, wenn eine Klasse erstellt wird Wird diese Funktion erstellt, wird sie automatisch aufgerufen. Sie kann zum Festlegen einiger Initialisierungsinformationen und Einstellungen des Objekts verwendet werden, wenn das Objekt erstellt wird.
  • _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__del__ Die Funktion ist der Destruktor der Python-Klasse. Wenn der Lebenszyklus eines Klassenobjekts endet und zerstört wird, wird diese Funktion hauptsächlich zum Freigeben verwendet des vom Objekt belegten Platzes usw.

2. Code-Demonstration

1. Die Referenzänderungen

sind wie folgt, und der Implementierungscode einer Demo-Klasse ist geschrieben.

>>> 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
>>>

Wenn dieses Klassenobjekt erstellt wird, ruft es die Funktion __init__ auf und gibt „init class“ aus.
Wenn dieses Klassenobjekt zerstört wird, ruft es __del__ Funktion, drucke „del class“ aus. 🎜rrreee🎜Verwenden Sie zunächst die Variable a1, um auf ein Demo-Klassenobjekt zu verweisen. Geben Sie zu diesem Zeitpunkt „init class“ und die Objektadresse aus, auf die die a1-Variable <code>0x7f328f7c6cb0 verweist. 🎜🎜Verwenden Sie die Variable a2, um zu verweisen zu einem anderen Demo-Klassenobjekt, geben Sie zu diesem Zeitpunkt „init class“ und die durch die a2-Variable referenzierte Objektadresse 0x7f328f7c6d40 aus. 🎜🎜Die durch die Variablen a1 und a2 referenzierten Klassenobjekte sind zwei verschiedene Objekte 0x7f328f7c6cb0 und 0x7f328f7c6d40. 🎜🎜Erstellen Sie schließlich ein Demo-Klassenobjekt und verwenden Sie die Variable a1, um erneut darauf zu verweisen. Zu diesem Zeitpunkt verweist a1 auf das neue Klassenobjekt und die Referenzadresse lautet gleichzeitig 0x7f328f7c6d88. Da das zuvor von a1 referenzierte Objekt 0x7f328f7c6cb0 ist, verweist niemand mehr darauf, sodass der Speicherplatz des alten Demo-Klassenobjekts freigegeben wird und „del class 0x7f328f7c6cb0“ ausgegeben wird. 🎜🎜2. Das Klassenobjekt nur innerhalb der Funktion🎜rrreee🎜Definieren Sie eine Funktion create_demo. Die Funktion dieser Funktion besteht darin, ein Demo-Klassenobjekt zu erstellen und die Variable inst zu verwenden, um auf das erstellte Klassenobjekt zu verweisen. 🎜🎜Rufen Sie die Funktion create_demo() einmal auf. Sie können sehen, dass das Demo-Objekt mit der Adresse 0x7f328f7c6cb0 erstellt wird create_demo-Funktion, die Funktion endet, das Demo-Objekt wird recycelt und freigegeben. 🎜🎜Rufen Sie die Funktion create_demo() erneut auf. Das Phänomen ist das gleiche: Das Demo-Objekt wird erstellt, die Adresse lautet 0x7f328f7c6cb0, dann wird das Demo-Objekt sofort freigegeben. 🎜🎜3. Das in der Funktion zurückgegebene Klassenobjekt 🎜rrreee🎜 Definieren Sie die Funktion return_demo, die intern ein Klassenobjekt erstellt und das erstellte Klassenobjekt zurückgibt. 🎜rrreee🎜Sie können sehen, dass beim ersten Aufruf der Funktion return_demo() der gedruckte Inhalt zeigt, dass zu diesem Zeitpunkt ein Objekt erstellt wurde und die Objektadresse 0x7fc511eb8cb0 der Funktion return_demo ist verwendet intern die return-Anweisung, um das erstellte Klassenobjekt zurückzugeben, sodass das Objekt 0x7fc511eb8cb0 nicht freigegeben wird, wenn die Funktion zurückkehrt. 🎜🎜Führen Sie als Nächstes eine Python-Anweisung aus: True und achten Sie darauf, dass das Objekt 0x7fc511eb8cb0 freigegeben wird. Da das Programm nach der Ausführung der Funktion return_demo() feststellt, dass das nachfolgende Programm nicht auf das von return_demo() zurückgegebene Objekt verweist, gibt Python den Objektraum 0x7fc511eb8cb0 frei. 🎜🎜Führen Sie den gleichen Vorgang ein zweites Mal aus und Sie können das gleiche Phänomen beobachten. 🎜rrreee🎜Das Phänomen dieses Code-Snippets ist im Grunde das gleiche wie das des vorherigen Code-Snippets. 🎜🎜Sie können sehen, dass v1_demo und v2_demo auf das Klassenobjekt verweisen, sodass die Werte von v1_demo und v2_demo nicht mehr None sind. 🎜🎜Schließlich setzen wir v1_demo auf Keine zurück. Zu diesem Zeitpunkt wird das von v1_demo referenzierte Objekt 0x7fc511eb8d88 freigegeben. 🎜🎜1. Verwenden Sie globale Variablen, um Klassenobjekte innerhalb von Funktionen zu referenzieren🎜rrreee🎜[Verwandte Empfehlungen: 🎜Python3-Video-Tutorial🎜]🎜

Das obige ist der detaillierte Inhalt vonDetailliertes Beispiel für die Zerstörung und Freigabe von Python-Klassenobjekten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jb51.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen