| ProgrammationObjet |
UserPreferences |
| Wiki Python Fr | FrontPage | RecentChanges | TitleIndex | WordIndex | SiteNavigation | HelpContents | moin.sf.net |
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.
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 |
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)) |