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.

280<br />

La bibliothèque standard<br />

TROISIÈME PARTIE<br />

>>> d = Data()<br />

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

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

TypeError: Can't instantiate abstract class Data with abstract methods<br />

__len__<br />

>>> class Data(Sized):<br />

... def __init__(self):<br />

... self._data = []<br />

... def add(self, data):<br />

... self._data.append(data)<br />

... def __len__(self):<br />

... return len(self._data)<br />

...<br />

>>> d = Data()<br />

>>> issubclass(Data, Sized)<br />

True<br />

Le problème de cette implémentation est qu’il reste nécessaire de faire dériver Data<br />

de Sized pour pouvoir bénéficier du mécanisme. À terme, les arbres de dérivation<br />

deviennent très complexes et l’héritage multiple fréquent.<br />

Pour éviter ce problème, ABCMeta ajoute une fonction register à la classe abstraite. Ceci<br />

permet de lui associer une classe arbitraire sans que cette dernière ne doive en dériver.<br />

Utilisation de register<br />

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

... def __init__(self):<br />

... self._data = []<br />

... def add(self, data):<br />

... self._data.append(data)<br />

... def __len__(self):<br />

... return len(self._data)<br />

...<br />

>>> Sized.register(Data)<br />

>>> issubclass(Data, Sized)<br />

True<br />

Cette fonctionnalité désolidarise les classes des classes abstraites et rapprochent ces<br />

dernières du concept d’interface. Un programme peut alors marquer des classes<br />

comme implémentatrices de méthodes définies dans des classes abstraites.<br />

Il est aussi possible d’exprimer cette association explicite de manière implicite en<br />

implémentant au niveau de Sized une méthode de classe __subclasshook__, qui sera<br />

invoquée à chaque appel de issubclass.

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

Saved successfully!

Ooh no, something went wrong!