Python Language Créer une classe singleton avec un décorateur


Exemple

Un singleton est un modèle qui limite l'instanciation d'une classe à une instance / objet. En utilisant un décorateur, nous pouvons définir une classe en tant que singleton en forçant la classe à renvoyer une instance existante de la classe ou à créer une nouvelle instance (si elle n'existe pas).

def singleton(cls):    
    instance = [None]
    def wrapper(*args, **kwargs):
        if instance[0] is None:
            instance[0] = cls(*args, **kwargs)
        return instance[0]

    return wrapper

Ce décorateur peut être ajouté à toute déclaration de classe et s'assurera qu'au plus une instance de la classe soit créée. Tous les appels suivants renverront l'instance de classe déjà existante.

@singleton
class SomeSingletonClass:
    x = 2
    def __init__(self):
        print("Created!")

instance = SomeSingletonClass()  # prints: Created!
instance = SomeSingletonClass()  # doesn't print anything
print(instance.x)                # 2

instance.x = 3
print(SomeSingletonClass().x)    # 3

Peu importe que vous vous référiez à l'instance de classe via votre variable locale ou que vous créiez une autre "instance", vous obtenez toujours le même objet.