Main menu:

Site search

Categories

octobre 2010
L M M J V S D
 123
45678910
11121314151617
18192021222324
25262728293031

Archive

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.