Python: les fonctions sont des objets
En python, tout est objet. Ceci est valable aussi pour les fonctions. Une fonction en python est un objet et peut donc avoir des attributs.
def ma_fonction(): pass
Cette foncion simple qui ne fait rien, a par exemple un attribut __name__. La commande suivante affichera le nom de la fonction:
>>> print ma_fonction.__name__
ma_fonction
L’utilisateur peut également définir ses propres attributs à cette fonction:
ma_fonction.description = "Une fonction qui ne fait rien" >>> print ma_fonction.description Une fonction qui ne fait rien
Les attributs sont stockés dans un attribut de la fonction appelé __dict__ qui comme son nom l’indique est un dictionnaire contenant seulement les attributs donnés par l’utilisateur. __name__ ne s’y retrouve pas par exemple:
>>> ma_fonction.__dict__ {'description': 'Une fonction qui ne fait rien'}
On peut aussi faire des choses un peu plus surprenantes:
class MaClasse(): def ma_fonction(self): print "ma fonction est exécutée" def une_autre_fonction(): print "une autre fonction est exécutée" >>> c= MaClasse() >>> c.ma_fonction() ma fonction est exécutée >>> c.ma_fonction = une_autre_fonction >>> c.ma_fonction() une autre fonction est exécutée
Autrement dit, j’ai remplacé dans ma classe l’objet ma_fonction par une_autre_fonction. Cela veut dire qu’au runtime, c’est à dire pendant l’exécution du programme, on peut dynamiquement modifier les fonctions. Vous noterez aussi qu’ici, on a assigné à une méthode de classe une fonction normale et ceci avec une aisance que seul python apporte.
A mon avis, ce n’est pas à utiliser trop souvent et même sans doute à éviter absolument sous peine de faire du débuggage du programme un véritable cauchemar.
Posted: octobre 2nd, 2010 under python.
Comments: none
Tweet