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
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.