140 votes

La méthode non liée f () doit être appelée avec le premier argument fibo_ (obtenu à la place de l'instance classobj)

je viens juste de commencer penchée en python, je suis en train de créer une classe et d'utiliser une méthode que j'ai écrit.

Je connais déjà le PHP et j'ai étudié un peu de C et C++ il y a quelques temps, donc je connais les bases.

J'ai écrit ce script:

Module 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()

Maintenant, j'ai cette 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)

Je n'ai aucune idée de ce qu'est un lié ou délié méthode est, si vous pouviez me l'expliquer, ce serait super. Mais surtout, quelle est l'erreur que je reçois?

Merci

179voto

kindall Points 60645

OK, tout d'abord, vous n'avez pas à obtenir une référence vers le module dans un nom différent, vous avez déjà une référence (à partir de l' import) et vous pouvez simplement l'utiliser. Si vous voulez un autre nom suffit d'utiliser import swineflu as f.

Seconde, vous obtenez une référence à la classe plutôt que de l'instanciation de la classe.

Donc, cela devrait être:

import swineflu

fibo = swineflu.fibo()  # get an instance of the class
fibo.f()                # call the method f of the instance

Une méthode liée est celui qui est attaché à une instance d'un objet. Un indépendant méthode est, bien sûr, celui qui n'est pas attachée à une instance. L'erreur signifie généralement que vous l'appel de la méthode de 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.

9voto

Mark Rushakoff Points 97350

fibo = f.fibo référence à la classe elle-même. Vous vouliez probablement que fibo = f.fibo() (notez les parenthèses) crée une instance de la classe, après quoi fibo.f() devrait réussir correctement.

f.fibo.f() échoue parce que vous appelez essentiellement f(self, a=0) sans fournir self ; self est "lié" automatiquement lorsque vous avez une instance de la classe.

4voto

lijie Points 3544

f est une méthode (d'instance). Cependant, vous l'appelez via fibo.f , où fibo est l'objet de classe. Par conséquent, f n'est pas lié (lié à aucune instance de classe).

Si vous avez fait

 a = fibo()
a.f()
 

alors que f est lié (à l'instance a ).

2voto

user225312 Points 22699
 import swineflu

x = swineflu.fibo()     # create an object `x` of class `fibo`, an instance of the class
x.f()                   # call the method `f()`, bound to `x`. 
 

Voici un bon tutoriel pour débuter avec les classes en Python.

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