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.

Duck typing et interfaces<br />

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

CHAPITRE 14<br />

Python n’utilisant pas de typage statique, le code peut se baser sur une philosophie de<br />

programmation polymorphique plus souple, qui tient en une phrase : If it quacks like<br />

a duck, then it’s a duck (littéralement : si ça fait « coin-coin », c’est un canard).<br />

Cette citation, tirée du film Sacré Graal, signifie que le type des objets peut être<br />

deviné par les attributs qu’ils portent. Ou plus précisément : si un objet porte un certain<br />

nombre d’attributs, il fait l’affaire.<br />

C’est ce principe qui est appliqué dans le code qui utilise les objets de type fichier ou<br />

assimilés, offrant ainsi la possibilité de substituer un objet de type StringIO dans du<br />

code prévu pour un objet de type file.<br />

Le duck typing se base sur l’utilisation de la primitive hasattr() pour analyser les<br />

attributs d’un objet et évite les primitives isinstance(), type() ou assimilés.<br />

Duck typing<br />

>>> import cStringIO<br />

>>> def litdonnees(objet):<br />

... ifnot hasattr(objet, 'readline'):<br />

... raise TypeError("l'objet n'a pas de fonction de lecture")<br />

... return objet.readline()<br />

...<br />

>>> object1 = cStringIO.StringIO('contenu')<br />

>>> litdonnees(object1)<br />

'contenu'<br />

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

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

... return 'pas de pb'<br />

...<br />

>>> object2 = Compatible()<br />

>>> litdonnees(object2)<br />

'pas de pb'<br />

>>> object3 = object()<br />

>>> litdonnees(object3)<br />

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

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

File "", line 3, in litdonnees<br />

TypeError: l'objet n'a pas de fonction de lecture<br />

Cette philosophie influence fortement l’orientation du programme en termes<br />

d’architecture et modifie le rôle de l’héritage : il n’est plus forcément utilisé lorsqu’il<br />

s’agit d’offrir le sésame à certaines fonctions pour un nouveau type de classe.<br />

495

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

Saved successfully!

Ooh no, something went wrong!