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.

Surcharge de type() par metaclass<br />

Structuration du code<br />

CHAPITRE 5<br />

Les classes en Python sont créées par le biais de la primitive type(), par un appel à<br />

type(nom de la classe, nom des classes de base, mapping des attributs). Il<br />

est possible avec les new-style class de surcharger ce mécanisme et de proposer sa<br />

propre fonction de création : la metaclass.<br />

Cette fonction finit toujours par appeler type() mais ce point d’accès supplémentaire<br />

sur la chaîne de construction rend les contrôles beaucoup plus puissants qu’avec les<br />

constructeurs statiques puisqu’il devient possible d’intervenir au moment de la création<br />

de la classe, mère de toutes les instances.<br />

Une metaclass se met en place en définissant une variable __metaclass__ pointant<br />

sur un objet callable. Cette variable peut se trouver dans la classe, et est utilisée à<br />

chaque fois qu’une instance de cette classe, ou de l’une des classes dérivées, est créée.<br />

Si elle n’est pas définie dans la classe, et si la classe ne possède pas d’attribut<br />

__class__, l’interpréteur regarde si une variable globale __metaclass__ existe.<br />

Metaclass à l’œuvre<br />

>>> def cls(cls, bases, dict):<br />

... print('classe "%s" en place' % cls)<br />

... return type(cls, bases, dict)<br />

...<br />

>>> __metaclass__ = cls<br />

>>> class Class1:<br />

... pass<br />

...<br />

classe "Class1" en place<br />

>>> class Class2:<br />

... pass<br />

...<br />

classe "Class2" en place<br />

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

... __metaclass__ = cls<br />

...<br />

classe "Class3" en place<br />

Cette puissance autorise la mise en place d’une quantité infinie de mécanismes,<br />

comme l’ajout d’attributs à la classe, l’implémentation de statistiques, etc.<br />

L’intérêt de ce mécanisme par rapport à la dérivation est de donner la possibilité<br />

d’introspecter dynamiquement l’interface d’une classe au moment de sa création.<br />

DANGER Les metaclass ne doivent pas être des pansements à une mauvaise architecture<br />

Le danger des metaclass est d’implémenter des fonctionnalités en cachant l’architecture et le fonctionnement<br />

des classes. Elles rendent aussi la compréhension du programme difficile.<br />

129

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

Saved successfully!

Ooh no, something went wrong!