En Python, j'essaye d'exécuter une méthode dans une classe et j'obtiens une erreur:
Traceback (most recent call last):
File "C:\Users\domenico\Desktop\py\main.py", line 8, in <module>
fibo.f()
TypeError: unbound method f() must be called with fibo instance
as first argument (got nothing instead)
Code: (swineflu.py)
class fibo:
a=0
b=0
def f(self,a=0):
print fibo.b+a
b=a;
return self(a+1)
Script main.py
import swineflu
f = swineflu
fibo = f.fibo
fibo.f() #TypeError is thrown here
Que signifie cette erreur? Qu'est ce qui cause cette erreur?
fibo = f.fibo()
Besoin d'instancier la classe avec des crochets.fibo().f()
Réponses:
OK, tout d'abord, vous n'avez pas besoin d'obtenir une référence au module sous un nom différent; vous avez déjà une référence (de la
import
) et vous pouvez simplement l'utiliser. Si vous voulez un autre nom, utilisez simplementimport swineflu as f
.Deuxièmement, vous obtenez une référence à la classe plutôt que l'instanciation de la classe.
Cela devrait donc être:
Une méthode liée est une méthode qui est attachée à une instance d'un objet. Une méthode indépendante est, bien entendu, une méthode qui n'est pas attachée à une instance. L'erreur signifie généralement que vous appelez la méthode sur la classe plutôt que sur une instance, ce qui est exactement ce qui se passait dans ce cas parce que vous n'aviez pas instancié la classe.
la source
swineflu.fibo().f()
si vous ne l'appelez qu'une seule fois.Comment reproduire cette erreur avec le moins de lignes possible:
Il échoue à cause de TypeError parce que vous n'avez pas instancié la classe en premier, vous avez deux choix: 1: soit rendre la méthode statique pour pouvoir l'exécuter de manière statique, soit 2: instancier votre classe pour avoir une instance à saisir sur, pour exécuter la méthode.
Il semble que vous souhaitiez exécuter la méthode de manière statique, procédez comme suit:
Ou, ce que vous vouliez probablement est d'utiliser l'instance instanciée comme ceci:
Si cela vous déroute, posez ces questions:
la source
fibo = f.fibo
fait référence à la classe elle-même. Vous vouliez probablementfibo = f.fibo()
(notez les parenthèses) créer une instance de la classe, après quoifibo.f()
devrait réussir correctement.f.fibo.f()
échoue parce que vous appelez essentiellementf(self, a=0)
sans fournirself
;self
est "lié" automatiquement lorsque vous avez une instance de la classe.la source
f
est une méthode (d'instance). Cependant, vous l'appelez viafibo.f
, où sefibo
trouve l'objet de classe. Par conséquent,f
est non lié (non lié à une instance de classe).Si tu as fait
alors cela
f
est lié (à l'instancea
).la source
Voici un bon tutoriel pour démarrer avec les classes en Python.
la source
En Python 2 (3 a une syntaxe différente):
Que faire si vous ne pouvez pas instancier votre classe Parent avant d'avoir besoin d'appeler l'une de ses méthodes?
Utilisez
super(ChildClass, self).method()
pour accéder aux méthodes parentes.la source
Différences dans les versions python 2 et 3:
Si vous avez déjà une méthode par défaut dans une classe avec le même nom et que vous la déclarez à nouveau sous le même nom, elle apparaîtra comme un appel de méthode non liée de cette instance de classe lorsque vous vouliez l'instancier.
Si vous vouliez des méthodes de classe, mais que vous les avez déclarées comme méthodes d'instance à la place.
Une méthode d'instance est une méthode utilisée pour créer une instance de la classe.
Un exemple serait
Méthode d'étiquette de classe:
Dans les versions python 2 et 3, la classe @classmethod diffère pour écrire en python 3, elle l'obtient automatiquement en tant que méthode d'étiquette de classe et n'a pas besoin d'écrire @classmethod, je pense que cela pourrait vous aider.
la source
Essaye ça. Pour python 2.7.12, nous devons définir le constructeur ou ajouter self à chaque méthode, puis définir une instance d'une classe appelée objet.
la source