[PageD'Accueil] [IndexDesTitres] [IndexDesTermes

Singleton

Un singleton est une classe qui ne peut avoir qu'une seule instance. Un cas d'utilisation est de s'en servir pour récupérer un accès à une base de données, de sorte qu'une seule et unique connection soit établie par le programme. Les inconvénients du Singleton sont les même que pour les variables globales, il faut donc en user avec parcimonie.

avec une classe privée

Exemple d'un singleton en Python

   1 class OnlyOne:
   2     class __OnlyOne:
   3         def __init__(self, arg):
   4             self.val = arg
   5         def __str__(self):
   6             return self.val
   7     instance = None
   8     def __init__(self, arg):
   9         if not OnlyOne.instance:
  10             OnlyOne.instance = OnlyOne.__OnlyOne(arg)
  11         else:
  12             OnlyOne.instance.val = arg
  13     def __getattr__(self, name):
  14         return getattr(self.instance, name)
  15 
  16 x = OnlyOne('sausage')
  17 print x
  18 y = OnlyOne('eggs')
  19 print y
  20 z = OnlyOne('spam')
  21 print z
  22 
  23 print "-----"
  24 print x
  25 print y

avec une classmethod

Un autre exemple :

   1 #python 2.3
   2 class Singleton:
   3     _singleton = None
   4     def getSingleton(cls):
   5         if not isinstance(cls._singleton,cls):
   6             cls._singleton = cls()
   7         return cls._singleton
   8 
   9     getSingleton = classmethod(getSingleton)
  10 
  11 if __name__=='__main__':
  12     class Test(Singleton):
  13         def test(self):
  14             print self.__class__,id(self)
  15 
  16     class Test1(Test):
  17         def test1(self):
  18             print self.__class__,id(self),'Test1'
  19 
  20     t1 = Test.getSingleton()
  21     t2 = Test.getSingleton()
  22     
  23     t1.test()
  24     t2.test()
  25     assert(isinstance(t1,Test))
  26     assert(isinstance(t2,Test))
  27     assert(id(t1)==id(t2))
  28 
  29     t1 = Test1.getSingleton()
  30     t2 = Test1.getSingleton()
  31 
  32     assert(isinstance(t1,Test1))
  33     assert(isinstance(t2,Test1))
  34     assert(id(t1)==id(t2))
  35     
  36     t1.test()
  37     t1.test1()
  38     t2.test()
  39     t1.test1()
  40 
  41     t3 = Test.getSingleton()
  42     
  43     t3.test()
  44     assert(isinstance(t3,Test))

2016-06-05 21:43