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.

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

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

...<br />

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

>>> d.add('data')<br />

Principaux modules, partie 2<br />

CHAPITRE 9<br />

La classe Data peut évidemment se passer de Sized pour fonctionner dans cet<br />

exemple, mais cette couche d’abstraction permet d’utiliser Sized comme un marqueur<br />

indiquant qu’un objet implémente __len__. Le test d’appartenance ci-dessous,<br />

indique qu’il est possible d’utiliser len() sur d.<br />

Test de l’appartenance de d à Sized<br />

>>> isinstance(d, Sized)<br />

True<br />

>>> len(d)<br />

1<br />

On peut traduire isinstance(d, Sized) par « Est-ce que je peux utiliser len sur d ?».<br />

abc sert à formaliser ce mécanisme. Une métaclasse ABCMeta est implémentée dans ce<br />

module, ainsi qu’un décorateur abstractmethod.<br />

Sized avec abc<br />

>>> from abc import ABCMeta, abstractmethod<br />

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

... __metaclass__ = ABCMeta<br />

... @abstractmethod<br />

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

... return 0<br />

Sized utilise dans ce cas ABCMeta comme métaclasse et marque __len__ avec le décorateur<br />

abstractmethod pour indiquer que c’est une méthode abstraite.<br />

Cette méthode devra obligatoirement être implémentée, et toute tentative d’instanciation<br />

d’une classe contenant encore des méthodes abstraites provoquera une erreur.<br />

L’utilisation explicite de NotImplementedError n’est donc plus requise.<br />

Création de Data au-dessus de Sized<br />

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

... pass<br />

...<br />

279

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

Saved successfully!

Ooh no, something went wrong!