17.12.2012 Views

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

502<br />

Techniques avancées<br />

QUATRIÈME PARTIE<br />

La seule faille de Singleton est qu’il n’est effectif que pour les classes dont il est<br />

directement dérivé, car un deuxième niveau de dérivation entraîne un problème<br />

visualisé dans l’exemple ci-dessous.<br />

Deux niveaux de dérivation<br />

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

... """ renvoie tjrs la même instance """<br />

... _ref = None<br />

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

... if cls._ref is None:<br />

... cls._ref = super(Singleton, cls).__new__(cls, *args, **kw)<br />

... return cls._ref<br />

...<br />

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

... pass<br />

...<br />

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

... pass<br />

...<br />

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

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

>>> type(b)<br />

<br />

L’instanciation de b renvoie à l’objet instancié précédemment par a et b n’est pas,<br />

comme le code semblerait l’indiquer, du type S2, mais du type S.<br />

Ce problème est intrinsèque au pattern Singleton mais une variante consiste à lever une<br />

exception sur toute nouvelle tentative d’instanciation au lieu de renvoyer le premier objet<br />

pour éviter de rendre ce mécanisme transparent et de subir les problèmes énoncés.<br />

Strict Singleton<br />

>>> class SingletonError(Exception):<br />

... pass<br />

...<br />

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

... """ provoque une erreur sur la deuxième instance """<br />

... _ref = None<br />

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

... if cls._ref isnot None:<br />

... raise SingletonError('Une instance existe déjà: %s'<br />

... % str(cls._ref))<br />

... cls._ref = super(Singleton, cls).__new__(cls, *args, **kw)<br />

... return cls._ref<br />

...

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

Saved successfully!

Ooh no, something went wrong!