capypad
0 Tage Serie
python / expert
Snippet

Metaklassen zur Erzwingung von Singletons

Metaklassen sind die 'Klassen von Klassen'. Durch das Überschreiben der __call__-Methode einer Metaklasse kann man den Instanziierungsprozess ihrer Klassen steuern. In diesem Beispiel stellt die Metaklasse sicher, dass nur eine einzige Instanz der Database-Klasse existiert, indem sie diese in einem privaten Dictionary speichert und wiederverwendet.

snippet.py
python
1
2
3
4
5
6
7
8
9
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kwargs)
return cls._instances[cls]
 
class Database(metaclass=Singleton):
pass
Erklärung
1
class Singleton(type):
Das Erben von 'type' definiert diese Klasse als Metaklasse.
2
def __call__(cls, *args, **kwargs):
Fängt den Aufruf des Klassenkonstruktors ab, um die Objekterstellung zu verwalten.
3
metaclass=Singleton
Weist Python an, die Singleton-Metaklasse für die Definition der Database-Klasse zu verwenden.