Wiki Python Fr   ProgrammationObjet UserPreferences
 
HelpContents FindPage Diffs Info Edit Subscribe XML Print View

  1. Singleton
    1. avec une classe privée
    2. avec une classmethod

1. 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.

1.1. avec une classe privée

Exemple d'un singleton en Python

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

x = OnlyOne('sausage')
print x
y = OnlyOne('eggs')
print y
z = OnlyOne('spam')
print z

print "-----"
print x
print y

1.2. avec une classmethod

Un autre exemple :

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

    getSingleton = classmethod(getSingleton)

if __name__=='__main__':
    class Test(Singleton):
        def test(self):
            print self.__class__,id(self)

    class Test1(Test):
        def test1(self):
            print self.__class__,id(self),'Test1'

    t1 = Test.getSingleton()
    t2 = Test.getSingleton()

    t1.test()
    t2.test()
    assert(isinstance(t1,Test))
    assert(isinstance(t2,Test))
    assert(id(t1)==id(t2))

    t1 = Test1.getSingleton()
    t2 = Test1.getSingleton()

    assert(isinstance(t1,Test1))
    assert(isinstance(t2,Test1))
    assert(id(t1)==id(t2))

    t1.test()
    t1.test1()
    t2.test()
    t1.test1()

    t3 = Test.getSingleton()

    t3.test()
    assert(isinstance(t3,Test))


PythonPowered