Singleton-Entwurfsmuster in Python

Manav Narula 23 Januar 2022
  1. Verwenden Sie die Dekoratoren, um das Singleton-Entwurfsmuster in Python zu implementieren
  2. Verwenden einer Basisklasse zum Implementieren des Singleton-Entwurfsmusters in Python
  3. Verwenden einer Metaklasse zum Implementieren des Singleton-Entwurfsmusters in Python
  4. Verwendung eines Moduls zur Implementierung des Singleton-Designmusters in Python
Singleton-Entwurfsmuster in Python

Entwurfsmuster können Code zur Lösung eines Problems darstellen. Singleton ist ein solches Entwurfsmuster, und wir können in Python verschiedene Objekte einer Klasse erstellen.

Dieses Muster schränkt nur ein Objekt einer bestimmten Klasse ein. Es gibt mehrere Methoden, um dieses Muster in Python zu simulieren.

Verwenden Sie die Dekoratoren, um das Singleton-Entwurfsmuster in Python zu implementieren

Dekoratoren in Python sind Funktionen, die andere Funktionen und Objekte als Argumente annehmen und ihr Verhalten ändern können. Um Dekorateure zu verwenden, verwenden wir das Zeichen @.

Wir können sie verwenden, um das Singleton-Entwurfsmuster zu implementieren.

Siehe das folgende Beispiel,

def singleton_dec(class_):
    instances = {}

    def getinstance(*args, **kwargs):
        if class_ not in instances:
            instances[class_] = class_(*args, **kwargs)
        return instances[class_]

    return getinstance


@singleton_dec
class Sample:
    def __init__(self):
        print("Object created.")


x = Sample()
y = Sample()
print(x, y)

Ausgabe:

Object created.
<__main__.Sample object at 0x0000015E72D3CA48> <__main__.Sample object at 0x0000015E72D3CA48>

Im obigen Beispiel haben wir einen Dekorator erstellt, der die gesamte Klasse als Argument verwendet. Mit diesem Dekorator können wir Singleton-Objekte implementieren, was durch die Position von x und y bestätigt werden kann.

Der Nachteil der Verwendung von Dekoratoren für Singleton besteht darin, dass die letzte Klasse Sample zu einer Funktion wird, sodass wir keine Klassenmethoden verwenden können.

Verwenden einer Basisklasse zum Implementieren des Singleton-Entwurfsmusters in Python

Eine Basisklasse ist eine spezielle Klasse, von der wir andere Klassen ableiten. Es werden keine Instanzen dieser Basisklasse erstellt.

Wir können eine Basisklasse verwenden, um die Struktur für Singleton in Python bereitzustellen.

Zum Beispiel,

class Singleton_base(object):
    _instance = None

    def __new__(class_, *args, **kwargs):
        if not isinstance(class_._instance, class_):
            class_._instance = object.__new__(class_, *args, **kwargs)
        return class_._instance


class Sample1(Singleton_base):
    def __init__(self):
        print("Object created.")


x = Sample1()
y = Sample1()
print(x, y)

Ausgabe:

Object created.
Object created.
<__main__.Sample object at 0x0000015E72D3F388> <__main__.Sample object at 0x0000015E72D3F388>

Dies ist eine effektive Methode; Es kann jedoch zu Fehlern kommen, wenn aufgrund mehrerer Vererbungen mehrere Klassen beteiligt sind.

Verwenden einer Metaklasse zum Implementieren des Singleton-Entwurfsmusters in Python

Eine Metaklasse ist ein sehr interessantes Feature in Python, da sie das Verhalten von Objekten einer Klasse definieren kann. Wir können sagen, es ist eine Klasse für eine Klasse.

In Python 2 fügen wir das Attribut __metaclass__ in eine Klasse ein. In Python 3 können wir es als Argument in der Klasse hinzufügen.

Wir können diese Funktion verwenden, um das Singleton-Design in Python zu implementieren.

Zum Beispiel,

class Singleton_meta(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton_meta, cls).__call__(*args, **kwargs)
        return cls._instances[cls]


class Sample(metaclass=Singleton_meta):
    def __init__(self):
        print("Object created.")


x = Sample()
y = Sample()
print(x, y)

Ausgabe:

Object created.
<__main__.Sample object at 0x0000015E72D3FF88> <__main__.Sample object at 0x0000015E72D3FF88>

Dies ist eine geeignete Anwendung der Metaklasse und erreicht eine automatische Vererbung.

Verwendung eines Moduls zur Implementierung des Singleton-Designmusters in Python

Die wahrscheinlich einfachste und grundlegendste Implementierung von Singletons in Python ist die Verwendung eines Moduls.

Wir wissen, dass wir Module in Python erstellen können. Ein Modul, das nur Funktionen enthält, kann als Singleton dienen, und zwar deshalb, weil es all diese Funktionen an das Modul bindet.

Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn