Überprüfen Sie das Verhalten des Zerstörers in Python
Beispielcode * class_test.py *
class_test.py
class SampleClass:
num = 0
def __init__(self, number=1):
SampleClass.num +=1 #Jedes Mal, wenn eine Instanz erstellt wird, wird die Klassenvariable num um 1 erhöht.
self.num = number #Speichern Sie die vom Generator beim Erstellen der Instanz empfangene Argumentnummer in der Instanzvariablen num.
def __del__(self):
SampleClass.num -=1 #Verringern Sie jedes Mal, wenn Sie eine Instanz löschen, 1 Klassenvariable num
print("Diese Instanz wurde gelöscht")
Starten Sie Python3 in derselben Hierarchie wie das Verzeichnis, das die obige Skriptdatei enthält
Terminal
$ ls
class_test.py
$ cat class_test.py
class SampleClass:
num = 0
def __init__(self, number=1):
SampleClass.num +=1 #Jedes Mal, wenn eine Instanz erstellt wird, wird die Klassenvariable num um 1 erhöht.
self.num = number #Speichern Sie die vom Generator beim Erstellen der Instanz empfangene Argumentnummer in der Instanzvariablen num.
def __del__(self):
SampleClass.num -=1 #Verringern Sie jedes Mal, wenn Sie eine Instanz löschen, 1 Klassenvariable num
print("Diese Instanz wurde gelöscht")
$
$ python3
>>>
* Importieren * Sie das Modul * class_test *, um eine Instanz der Klasse * SampleClass * zu erstellen und zu löschen.
Terminal
>>> import class_test as ct
>>>
>>> sample_1 = ct.SampleClass()
>>> print(ct.SampleClass.num)
1
>>>
>>> print(sample_1.num)
1
>>>
(Punkte hier)
- Erstellt eine Instanz der Klasse * SampleClass *.
- Der Wert der Klassenvariablen * num *, die die Anzahl der Instanzen verwaltet, wird als 1 angezeigt.
- Außerdem wird der Wert der Instanzvariablen * num * der generierten Instanz * sample_1 * im Standardargument des Konstruktors auf 1 gesetzt.
Terminal
>>> sample_2 = ct.SampleClass(number=4)
>>> print(ct.SampleClass.num)
2
>>> print(sample_2.num)
4
>>>
(Punkte hier)
- Erstellt eine weitere Instanz der Klasse * SampleClass *.
- Der Wert der Klassenvariablen * num *, die die Anzahl der Instanzen verwaltet, wird als 2 angezeigt.
- Außerdem wird der Wert der Instanzvariablen * num *, die die generierte Instanz * sample_2 * hat, auf 4 gesetzt, die als Argument an den Konstruktor übergeben wurde, als * sample_2 * generiert wurde.
Terminal
>>> sample_3 = ct.SampleClass(number=15)
>>> print(ct.SampleClass.num)
3
>>> print(sample_3.num)
15
>>>
(Punkte hier)
- Erstellt eine weitere Instanz der Klasse * SampleClass *. Sie haben jetzt insgesamt 3 Instanzen erstellt.
- Der Wert der Klassenvariablen * num *, die die Anzahl der Instanzen verwaltet, wird als 3 angezeigt.
- Außerdem wird der Wert der Instanzvariablen * num *, die die generierte Instanz * sample_3 * hat, auf 15 gesetzt, die als Argument an den Konstruktor übergeben wurde, als * sample_3 * generiert wurde.
Von hier aus können Sie das Verhalten des Zerstörers überprüfen.
Terminal
>>> del sample_2
Diese Instanz wurde gelöscht
>>>
(Punkte hier)
- Der im * Zerstörer * der * SampleClass * -Klasse beschriebene * print ("Diese Instanz wurde gelöscht") wurde ausgeführt.
- Sie haben jetzt zwei Instanzen.
Terminal
>>> print(ct.SampleClass.num)
2
>>> print(sample_1.num)
1
>>> print(sample_3.num)
15
>>> print(sample_2.num)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'sample_2' is not defined
>>>
(Punkte hier)
- Der Wert der Klassenvariablen * num *, die die Anzahl der Instanzen verwaltet, wird als 2 angezeigt.
- Wenn Sie die Instanz mit dem Namen * sample_2 * löschen, können Sie feststellen, dass der in * destructor * beschriebene Prozess zum Dekrementieren der Klassenvariablen * num * ordnungsgemäß ausgeführt wurde.
- Zu diesem Zeitpunkt wurde auch bestätigt, dass sich die Instanzvariablen der beiden Instanzen (* sample_1 * und * sample_3 *) außer der gelöschten Instanz nicht im Wert geändert haben und nicht unbeabsichtigt betroffen waren. ..
(Zusatz)
Der Code wird kürzer, wenn die * import * -Anweisung wie folgt lautet.
Importanweisung (nach Änderung)
from class_test import SampleClass
Terminal
>>> from class_test import SampleClass
>>>
>>> sample_1 = SampleClass()
>>> print(SampleClass.num)
1
>>> print(sample_1.num)
1
>>>
>>> sample_2 = SampleClass(number=4)
>>> print(SampleClass.num)
2
>>> print(sample_2.num)
4
>>>
(Referenzwebseite)
- Verwendung des Python-Destruktors [für Anfänger]
- [Python] Finde die Anzahl der Instanzen
- Informationen zu Python-Klassen
- @ ysk24oks Qiita-Artikel "[Python] Import Stumbling Point"