Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist ein Python-Singleton-Muster?

Was ist ein Python-Singleton-Muster?

(*-*)浩
(*-*)浩Original
2019-05-23 10:39:279477Durchsuche

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;

Was ist ein Python-Singleton-Muster?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn