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.

132<br />

Éléments du langage<br />

DEUXIÈME PARTIE<br />

On retrouve ainsi un modèle beaucoup plus léger que les descriptors et très proche<br />

syntaxiquement d’autres langages qui implémentent les propriétés, comme Delphi.<br />

Slots<br />

À chaque création d’objet, l’interpréteur associe à l’instance un dictionnaire __dict__<br />

chargé de contenir ses attributs. Les slots introduisent un mécanisme global à la<br />

classe, qui permet d’éviter la création d’un __dict__ par instance pour économiser de<br />

l’espace mémoire : le mapping modifie sa façon d’accéder aux attributs, en se référant<br />

aux slots.<br />

Ce gain devient intéressant lorsqu’une même classe est instanciée une multitude de<br />

fois dans un programme.<br />

Les slots sont définis dans une variable statique __slots__, sous la forme d’une<br />

séquence ou d’un itérable. Si une seule variable est à réserver, __slots__ peut être un<br />

objet de type string.<br />

Utilisation des slots<br />

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

... __slots__ = ['color', 'immatriculation', 'horsepower']<br />

...<br />

>>> car = Car()<br />

>>> car.color = 'Rouge'<br />

>>> car.immatriculation = '1111 XR 21'<br />

>>> car.horsepower = 7<br />

>>> dir(car)<br />

['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__',<br />

'__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',<br />

'__repr__', '__setattr__', '__slots__', '__str__', 'color',<br />

'immatriculation', 'horsepower']<br />

>>> hasattr(car, '__dict__')<br />

False<br />

>>> car.color<br />

'Rouge'<br />

L’utilisation des slots entraîne cependant quelques restrictions :<br />

L’implémentation des slots, basée sur les descriptors, empêche l’utilisation d’attributs<br />

de classe pour initialiser les valeurs des attributs définis dans les slots : ils<br />

écraseraient les définitions de descriptors.<br />

Si une classe de base définit le même nom de slot que la classe dérivée, la variable<br />

de la classe de base ne peut plus être atteinte. Il est donc nécessaire de contrôler<br />

qu’un slot ne surcharge pas un autre slot, en attendant qu’une prochaine version<br />

de Python ajoute un contrôle pour empêcher ce problème.

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

Saved successfully!

Ooh no, something went wrong!