Glossar zur Objektorientierung mit Python

<== Zur Übersicht der Begriffe ==>


Singleton


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.


Beispiel

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, in 
    versuch4 = SollEsNurEinmalGeben()
  File "/home/pool/LI/2016-LI-OO-Python/Singleton_Test.py", line 31, in __init__
    raise VerstossGegenSingletonError()
VerstossGegenSingletonError: Konstruktor nicht direkt aufrufen!

<== Zur Übersicht der Begriffe ==>

© Claus Albowski