486 votes

Y a-t-il un moyen simple et élégant pour définir des Singletons en Python ?

Il semble y avoir plusieurs façons de définir des Singletons en Python. Y a-t-il une opinion d’accord sur StackOverflow ?

391voto

Staale Points 8795

Je ne vois vraiment pas la nécessité, comme un module de fonctions (et non pas une classe) serait bien servir un singleton. L'ensemble de ses variables serait lié au module, ce qui ne peut pas être instancié plusieurs reprises, de toute façon.

Si vous souhaitez utiliser une classe, il n'y a aucun moyen de créer des cours privés ou privés constructeurs en python, de sorte que vous ne pouvez pas les protéger contre plusieurs instanciations, des autres que par le biais de la convention dans l'utilisation de votre API. Je voudrais encore mettre juste des méthodes dans un module, et d'envisager le module comme le singleton.

123voto

Peter Hoffmann Points 13823

Une approche légèrement différente pour mettre en œuvre le singleton en python est le modèle borg par Alex Martelli (employé de google, génie de la python).

Ainsi, au lieu de forcer toutes les instances ayant la même identité ils partagent l’État.

87voto

Acuminate Points 674

L’approche de module fonctionne bien. Si j’ai absolument besoin d’un singleton, je préfère l’approche de métaclasse.

37voto

jojo Points 1896

Substituez `` méthode

27voto

Lambda Fairy Points 2353

Comme la accepté de répondre à dit, la plupart des idiomatiques façon consiste à utiliser un module.

Avec cela à l'esprit, voici une preuve de concept:

def singleton(cls):
    obj = cls()
    # Always return the same object
    cls.__new__ = staticmethod(lambda cls: obj)
    # Disable __init__
    try:
        del cls.__init__
    except AttributeError:
        pass
    return cls

Voir le Python, modèle de données pour plus de détails sur __new__.

Exemple:

@singleton
class Duck(object):
    pass

if Duck() is Duck():
    print "It works!"
else:
    print "It doesn't work!"

Notes:

  1. Vous devez utiliser le nouveau style de classes (en dérivent object) pour cela.

  2. Le singleton est initialisé quand elle est définie, plutôt que la première fois qu'il l'utilise.

  3. C'est juste un jouet par exemple. Je n'ai jamais réellement utilisé dans la production de code, et je ne prévois pas de.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X