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.

130<br />

Éléments du langage<br />

DEUXIÈME PARTIE<br />

Descriptors<br />

Lorsqu’un attribut a est recherché dans un objet A par l’interpréteur que ce soit pour une<br />

lecture, une affectation, ou une suppression, il invoque tour à tour A.__dict__['a'],<br />

puis type(A).__dict__['a'], et ainsi de suite jusqu’à la classe de base.<br />

Les descriptors permettent de surcharger ce mécanisme en fournissant à l’interpréteur<br />

des méthodes __get__(), __set__() et __delete__().<br />

Une seconde new-style class doit être spécifiquement créée pour l’attribut et doit<br />

définir ces méthodes. Cette classe devient une sorte d’encapsulation et permet de<br />

gérer toutes les demandes d’accès à l’attribut.<br />

Descriptor<br />

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

... def __get__(self, instance, classe):<br />

... if instance isnot None and hasattr(instance, '_immat'):<br />

... return instance._immat<br />

... else:<br />

... return ''<br />

... def __set__(self, instance, valeur):<br />

... instance._immat = valeur<br />

... def __delete__(self, instance):<br />

... print('Suppression interdite !')<br />

...<br />

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

... immatriculation = Immatriculation()<br />

...<br />

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

>>> electric_car.immatriculation<br />

''<br />

>>> electric_car.immatriculation = 'V'<br />

>>> electric_car.immatriculation<br />

'V'<br />

>>> dir(electric_car)<br />

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

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

'__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__',<br />

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

>>> del electric_car.immatriculation<br />

Suppression interdite !<br />

>>> electric_car.immatriculation<br />

'V'<br />

>>> Car.immatriculation<br />

''

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

Saved successfully!

Ooh no, something went wrong!