In Python ist das Singleton-Muster ein häufig verwendetes Software-Designmuster. Der Hauptzweck dieses Musters besteht darin, sicherzustellen, dass eine bestimmte Klasse nur ein Instanzobjekt im Speicher haben kann, das durch die Singleton-Mustermethode erstellt wird . Eine Klasse hat im aktuellen Prozess nur ein Instanzobjekt. Das Singleton-Muster ist unterteilt in: 1. Lazy-Stil, der Objekte erstellt, sobald die Klasse geladen wird; 2. Hungry-Stil, der Objekte nur erstellt, wenn sie verwendet wird;
Singleton-Muster ist ein häufig verwendetes Software-Designmuster. Der Hauptzweck dieses Musters besteht darin, sicherzustellen, dass nur eine Instanz einer bestimmten Klasse vorhanden ist. Singleton-Objekte sind praktisch, wenn Sie möchten, dass nur eine Instanz einer bestimmten Klasse im gesamten System angezeigt wird.
Zum Beispiel werden die Konfigurationsinformationen eines Serverprogramms in einer Datei gespeichert und der Client liest die Konfigurationsdateiinformationen über eine AppConfig-Klasse. Wenn während der Ausführung des Programms an vielen Stellen der Inhalt der Konfigurationsdatei verwendet werden muss, also an vielen Stellen Instanzen des AppConfig-Objekts erstellt werden müssen, führt dies zur Existenz mehrerer AppConfig-Instanzen Objekte im System, was zu einer erheblichen Speicherverschwendung führt, insbesondere wenn die Konfigurationsdatei viel Inhalt enthält. Tatsächlich hoffen wir für eine Klasse wie AppConfig, dass nur ein Instanzobjekt vorhanden ist, während das Programm ausgeführt wird.
Es gibt drei Hauptpunkte des Singleton-Musters: Erstens kann eine Klasse nur eine Instanz haben; zweitens muss sie diese Instanz selbst erstellen; Gesamtsystem für sich Beispiel.
In Python können wir verschiedene Methoden verwenden, um das Singleton-Muster zu implementieren:
Module verwenden
Verwenden Sie __new__
Verwenden Sie Dekoratoren
Verwenden Sie Module
Tatsächlich sind Python-Module natürliche Singleton-Muster.
Denn wenn das Modul zum ersten Mal importiert wird, wird eine .pyc-Datei generiert. Beim zweiten Import wird die .pyc-Datei direkt geladen, ohne dass der Modulcode erneut ausgeführt werden muss. Daher müssen wir nur die relevanten Funktionen und Daten in einem Modul definieren, um ein Singleton-Objekt zu erhalten.
Wenn wir wirklich eine Singleton-Klasse wollen, sollten Sie Folgendes in Betracht ziehen:
#tests1.py class MyClass(object): def foo(self): print('MyClass.foo') my_class_obj=MyClass()
Speichern Sie den obigen Code in der Datei test1.py und verwenden Sie ihn wie folgt:
from .tests1 import my_class_obj my_class_obj.foo()
Verwenden Sie __new__
Um nur eine Instanz der Klasse anzuzeigen, können wir __new__ verwenden, um den Erstellungsprozess der Instanz zu steuern. Der Code lautet wie folgt:
class MyClass(object): _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super(MyClass, cls).__new__(cls, *args, **kwargs) return cls._instance class HerClass(MyClass): a = 1
Im obigen Code verknüpfen wir die Instanz der Klasse mit einer Klassenvariablen _instance. Wenn cls._instance None ist, erstellen Sie die Instanz, andernfalls geben Sie cls._instance direkt zurück.
Die Ausführung ist wie folgt:
one = HerClass() two = HerClass() print(one == two) #True print(one is two) #True print(id(one), id(two)) #42818864 42818864
Dekorator verwenden
Wir wissen, dass der Dekorator dynamisch geändert werden kann. Die Funktionalität von eine Klasse oder Funktion. Hier können wir auch einen Dekorator verwenden, um eine Klasse so zu dekorieren, dass sie nur eine Instanz generieren kann. Der Code lautet wie folgt:
from functools import wraps def singleton(cls): instances = {} @wraps(cls) def getinstance(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return getinstance @singleton class MyClass(object): a = 1
Oben haben wir einen Dekorator-Singleton definiert, der eine interne Funktion getinstance zurückgibt Die Funktion ermittelt, ob sich eine bestimmte Klasse in den Wörterbuchinstanzen befindet. Wenn sie nicht vorhanden ist, speichert sie cls(*args, **kw) als Wert. Andernfalls werden direkt Instanzen[cls] zurückgegeben. .
Das obige ist der detaillierte Inhalt vonWas ist ein Python-Singleton-Muster?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!