Il semble y avoir plusieurs façons de définir des Singletons en Python. Y a-t-il une opinion d’accord sur StackOverflow ?
- Création d’un singleton en python (5 réponses )
Réponses
Trop de publicités?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.
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.
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:
Vous devez utiliser le nouveau style de classes (en dérivent
object
) pour cela.Le singleton est initialisé quand elle est définie, plutôt que la première fois qu'il l'utilise.
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.