En génie logiciel, le singleton est un patron de conception (design pattern) dont l'objet est de restreindre l'instanciation d'une classe à un seul objet (ou bien à quelques objets seulement). Il est utilisé lorsque l'on a besoin d'exactement un objet pour coordonner des opérations dans un système. Le modèle est parfois utilisé pour son efficacité, lorsque le système est plus rapide ou occupe moins de mémoire avec peu d'objets qu'avec beaucoup d'objets similaires. On implémente le singleton en écrivant une classe contenant une méthode qui crée une instance uniquement s'il n'en existe pas encore. Sinon elle renvoie une référence vers l'objet qui existe déjà. Dans beaucoup de langages de type objet, il faudra veiller à ce que le constructeur de la classe soit privé, afin de s'assurer que la classe ne puisse être instanciée autrement que par la méthode de création contrôlée. Le singleton doit être implémenté avec précaution dans les applications multi-thread. Si deux threads exécutent en même temps la méthode de création alors que l'objet unique n'existe pas encore, il faut absolument s'assurer qu'un seul créera l'objet, et que l'autre obtiendra une référence vers ce nouvel objet. La solution classique à ce problème consiste à utiliser l'exclusion mutuelle pour indiquer que l'objet est en cours d'instanciation. Python Implémentation simple class Singleton (object): instance = None # Attribut statique de classe def __new__(laClasse): "méthode de construction standard en Python" if laClasse.instance is None: laClasse.instance = object.__new__(laClasse) return laClasse.instance # Utilisation monSingleton1 = monSingleton2 = Singleton() Singleton() # monSingleton1 et monSingleton2 renvoient à la même instance assert monSingleton1 is monSingleton2 Les deux variables référencent ici la même instance. Cette solution ne nécessite pas de méthode spécifique pour accéder à l'instance de classe (comparativement à d'autres langages, où il est d'usage d'implémenter une méthode getInstance(), par exemple). http://fr.wikipedia.org/wiki/Singleton_%28patron_de_conception%29 Contexte Le design pattern singleton est utile chaque fois que l'on souhaite qu'une seule instance d'une classe soit créée bien que cette instance puisse être référencée à différents endroits. Solution La classe elle-même est responsable de l'unicité de son instance. Avantages La classe possède un contrôle total sur le nombre d'instances crées, au lieu de laisser au programmeur la responsabilité de contrôler qu'il n'existe qu'une seule instance de la classe. Le design pattern singleton peut être facilement étendu afin de permettre la création d'un nombre limité d'instances. Réalisation du singleton en Python Note: Cette implémentation du singleton utilise la méthode spéciale __new__ disponible depuis la version 2.2 de Python. class Singleton(object) class __Singleton: def __init__(self): self.val = None def __str__(self): return `self` + self.val instance = None def __new__(c): # _new_ est toujours une méthode de classe if not Singleton.instance: Singleton.instance = Singleton.__Singleton() return Singleton.instance def __getattr__(self, attr): return getattr(self.instance, attr) def __setattr__(self, attr, val): return setattr(self.instance, attr, val) Le nom de la classe interne est précédé de deux soulignés, elle est donc privée et inaccessible à l'utilisateur qui ne peut qu'instancier la classe principale. Lors de la première instanciation, la variable instance est initialisée. Lors des instanciations suivantes, la même instance est retournée à l'utilisateur. Toutes les méthodes de la classe sont déplacées dans la classe interne et les methodes __getattr__ et __setattr__ de la classe principale font toujours référence aux attributs de la classe interne. Voici un test d'exécution de la classe Singleton : x = Singleton() x.val = 'sausage' print x y = Singleton() y.val = 'eggs' print y z = Singleton() z.val = 'spam' print z print x print y Résultat : <_main_._Singleton <_main_._Singleton <_main_._Singleton <_main_._Singleton <_main_._Singleton instance instance instance instance instance at at at at at 0x814d9dc>sausage 0x814d9dc>eggs 0x814d9dc>spam 0x814d9dc>spam 0x814d9dc>spam http://all4dev.libre-entreprise.org/index.php/Le_singleton_en_python Site officiel de python https://wiki.python.org/moin/SingletonProgramming