Le problème est que le premier argument passé aux méthodes de classe en Python est toujours une copie de l'instance de classe sur laquelle la méthode est appelée, généralement étiquetée self
. Si la classe est déclarée ainsi :
class foo(object):
def foodo(self, thing=None, thong='not underwear'):
print thing if thing else "nothing"
print 'a thong is',thong
elle se comporte comme prévu.
Explication :
Sans self
comme premier paramètre, lorsque myfoo.foodo(thing="something")
est exécuté, la méthode foodo
est appelée avec les arguments (myfoo, thing="something")
. L'instance myfoo
est alors assignée à thing
(puisque thing
est le premier paramètre déclaré), mais Python tente également d'assigner "something"
à thing
, d'où l'exception.
Pour le démontrer, essayez d'exécuter ceci avec le code original :
myfoo.foodo("something")
print
print myfoo
Vous obtiendrez :
<__main__.foo object at 0x321c290>
a thong is something
<__main__.foo object at 0x321c290>
Vous pouvez voir que 'thing' a été assigné à une référence de l'instance 'myfoo' de la classe 'foo'. Cette section de la documentation explique un peu plus comment fonctionnent les arguments de fonction.