10 votes

Comment l'affectation d'une fonction comme attribut de classe devient-elle une méthode en Python ?

>>> class A(object): pass
>>> def func(cls): pass
>>> A.func = func
>>> A.func
<unbound method A.func>

Comment cette mission crée-t-elle une méthode ? Il semble peu intuitif que l'affectation fasse ce qui suit pour les classes :

  • Transformer les fonctions en méthodes d'instance non liées
  • Tourner les fonctions enveloppées dans classmethod() dans les méthodes de classe (en fait, c'est assez intuitif)
  • Tourner les fonctions enveloppées dans staticmethod() en fonctions

Il semble que pour le premier, il devrait y avoir une instancemethod() et pour la dernière, il ne devrait pas y avoir de fonction wrapper du tout. Je comprends que ces fonctions sont destinées à être utilisées dans un class mais pourquoi devraient-ils s'appliquer en dehors de ce bloc ?

Mais surtout, comment fonctionne exactement l'affectation de la fonction à une classe ? Quelle est la magie qui permet de résoudre ces trois problèmes ?

Encore plus confus avec ça :

>>> A.func
<unbound method A.func>
>>> A.__dict__['func']
<function func at 0x...>

Mais je pense que c'est quelque chose à voir avec les descripteurs, quand récupération de attributs. Je ne pense pas que cela ait beaucoup à voir avec les paramètre d'attributs ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X