17.12.2012 Views

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Programmation</strong> orientée objet<br />

CHAPITRE 14<br />

>>> class S(Singleton):<br />

... pass<br />

...<br />

>>> class S2(S):<br />

... pass<br />

...<br />

>>> a = S()<br />

>>> b = S2()<br />

Traceback (most recent call last):<br />

File "", line 1, in ?<br />

File "", line 6, in __new__<br />

__main__.SingletonError: Une instance existe déjà: <br />

Alex Martelli, dans Python Cookbook (O’Reilly, 2001), propose une autre variante de<br />

Singleton, nommée Borg ou Monostate, qui règle aussi ce problème et répond au<br />

besoin du Singleton de manière plus fine : il part du constat que ce n’est pas l’unicité<br />

de l’instance qui compte mais l’unicité de l’état de l’objet.<br />

En d’autres termes, peu importe qu’il y ait plusieurs instances du moment qu’elles<br />

partagent toutes le même état.<br />

Pattern Borg<br />

>>> class Borg(object):<br />

... _shared_state = {}<br />

... def __new__(cls, *args, **kw):<br />

... instance = super(Borg, cls).__new__(cls, *args, **kw)<br />

... instance.__dict__ = cls._shared_state<br />

... return instance<br />

...<br />

>>> class B(Borg):<br />

... pass<br />

...<br />

>>> a = B()<br />

>>> a.A = 1<br />

>>> b = B()<br />

>>> b.A<br />

1<br />

>>> b.B = 2<br />

>>> a.B<br />

2<br />

>>> a is b<br />

False<br />

Borg rend commun à toutes les instances de la classe le dictionnaire interne<br />

__dict__, et de par ce fait l’état. Le problème lié à plusieurs niveaux de dérivations<br />

disparaît aussi.<br />

503

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!