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.

508<br />

Techniques avancées<br />

QUATRIÈME PARTIE<br />

Pour implémenter Observer le code doit :<br />

Fournir une méthode d’enregistrement pour que chaque observateur puisse s’inscrire<br />

à un événement donné auprès de l’objet à observer.<br />

Implémenter un système qui intercepte un changement d’état et prévient les<br />

observateurs inscrits.<br />

L’événement est logiquement une classe à laquelle une liste est associée. Cette liste<br />

contient l’ensemble des observateurs associés à l’événement.<br />

Pour simplifier l’écriture, __iadd__() et __isub__() sont utilisées afin de permettre à<br />

un observateur de :<br />

s’inscrire en s’ajoutant à l’événement : Evenement += Observateur ;<br />

se désinscrire en se soustrayant : Evenement -= Observateur.<br />

L’implémentation proposée empêche en outre un même observateur de s’inscrire<br />

plusieurs fois à un événement.<br />

Classe Event<br />

class Event(object):<br />

""" Classe événement """<br />

def __init__(self, name):<br />

self.name = name<br />

self._observateurs = []<br />

def __iadd__(self, observateur):<br />

""" ajoute un observateur """<br />

ifnot callable(observateur):<br />

raise TypeError("Doit être un objet appelable")<br />

observateurs = self._observateurs<br />

if observateur notin observateurs:<br />

observateurs.append(observateur)<br />

return self<br />

def __isub__(self, observateur):<br />

""" retire un observateur """<br />

observateurs = self._observateurs<br />

if observateur in observateurs:<br />

observers.remove(observateur)<br />

return self<br />

def __call__(self, *args, **kw):<br />

""" déclenche l'événement auprès de tous les inscrits """<br />

[observateur(*args, **kw) for observateur in self._observateurs]

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

Saved successfully!

Ooh no, something went wrong!