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.

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

CHAPITRE 14<br />

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

TypeError: unbound method b() must be called with B instance as first<br />

argument (got A instance instead)<br />

>>> # qu'à cela ne tienne...<br />

...<br />

>>> objet.__class__ = B<br />

>>> B.b(objet)<br />

est passé par B<br />

>>> objet.b()<br />

est passé par B<br />

Le seul contrôle effectué par l’interpréteur est de vérifier que l’attribut __class__ de<br />

l’instance corresponde à la classe traversée. Il suffit donc de le changer pour rendre<br />

l’objet compatible.<br />

Il est cependant nécessaire de prendre quelques précautions supplémentaires au<br />

moment du changement d’état :<br />

Le constructeur de la classe doit être appelé, pour assurer l’intégrité de l’état de<br />

l’objet.<br />

Les attributs privés de l’objet, stockés dans __dict__ sous la forme<br />

_Classe_attribut, doivent être manuellement supprimés, même si ces résidus ne<br />

peuvent pas en théorie poser de problèmes.<br />

State<br />

class State(object):<br />

def change_state(self, class_, *args, **kw):<br />

""" méthode de changement dynamique de classe """<br />

# permet d'éviter une réinitialisation<br />

if self.__class__ is class_:<br />

return None<br />

# suppression des attributs privés<br />

# spécifiques à la classe en cours<br />

class_name = self.__class__.__name__<br />

for attribute in tuple(self.__dict__):<br />

if attribute.startswith('_%s__' % class_name):<br />

del self.__dict__[attribute]<br />

# passage au nouveau type<br />

self.__class__ = class_<br />

# initialisation<br />

if hasattr(self, '__init__'):<br />

self.__init__(*args, **kw)<br />

517

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

Saved successfully!

Ooh no, something went wrong!