Das Singleton gehört zu den Entwurfsmuster der objektorientierten Programmierung.
Von einer Singleton - Klasse lässt sich genau eine Instanz erzeugen.
Dazu müsste der Konstruktor der Klasse private sein, damit er nicht von außen aufgerufen werden kann. Das ist bei Python aber nicht möglich.
Außerdem muss die Klasse eine Klassenmethode bereitstellen, die beim ersten Aufruf die einzige Instanz erzeugt und anschließend zurückgibt, bei allen nachfolgenden Aufrufen nur diese eine Instanz zurückgibt.
Die Klasse SollEsNurEinmalGeben demonstriert eine Anwendung des Singleton Entwurfsmusters.
### --------------------------------------------------- ## Die selbst definierte Exception-Klasse class VerstossGegenSingletonError(Exception): def __init__(self): pass def __str__(self): return "Konstruktor nicht direkt aufrufen!" ### --------------------------------------------------- class SollEsNurEinmalGeben(object): """Die Klasse wendet das Singleton-Muster an, also kein Konstruktoraufruf, sondern Methode GibEinziges()""" __singleton = None @staticmethod def GibEinziges(): if SollEsNurEinmalGeben.__singleton == None: SollEsNurEinmalGeben.__singleton = SollEsNurEinmalGeben() return SollEsNurEinmalGeben.__singleton def __init__(self): """Konstruktor !nicht direkt aufrufen!""" ### Wesentliche Aenderung: ################################ if SollEsNurEinmalGeben.__singleton != None: raise VerstossGegenSingletonError() ########################################################### SollEsNurEinmalGeben.__singleton = self def Zeige(self): print "Mich gibt es:", SollEsNurEinmalGeben.__singleton
Ein Test mit
versuch1 = SollEsNurEinmalGeben() versuch1.Zeige() versuch2 = SollEsNurEinmalGeben.GibEinziges() versuch2.Zeige() versuch3 = SollEsNurEinmalGeben.GibEinziges() versuch3.Zeige() versuch4 = SollEsNurEinmalGeben() versuch4.Zeige()
liefert:
Mich gibt es: <__main__.SollEsNurEinmalGeben object at 0x7f5727c554d0> Mich gibt es: <__main__.SollEsNurEinmalGeben object at 0x7f5727c554d0> Mich gibt es: <__main__.SollEsNurEinmalGeben object at 0x7f5727c554d0> Traceback (most recent call last): File "/home/pool/LI/2016-LI-OO-Python/Singleton_Test.py", line 45, inversuch4 = SollEsNurEinmalGeben() File "/home/pool/LI/2016-LI-OO-Python/Singleton_Test.py", line 31, in __init__ raise VerstossGegenSingletonError() VerstossGegenSingletonError: Konstruktor nicht direkt aufrufen!
© Claus Albowski