niezwiązana metoda f () musi być wywołana z instancją fibo_ jako pierwszym argumentem (zamiast tego otrzymano instancję classobj)

139

W Pythonie próbuję uruchomić metodę w klasie i pojawia się błąd:

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)

Kod: (swineflu.py)

class fibo:
    a=0
    b=0

    def f(self,a=0):
        print fibo.b+a
        b=a;
        return self(a+1)

Skrypt main.py

import swineflu

f = swineflu
fibo = f.fibo

fibo.f()            #TypeError is thrown here

Co oznacza ten błąd? Co powoduje ten błąd?

DomeWTF
źródło
1
Chcesz utworzyć instancję obiektu, czy nie?
Thomas
2
Nazwa klasy powinna być pisana wielkimi literami.
CDT
1
fibo = f.fibo()Musisz umieścić klasę w nawiasach.
Kotlinboy,
Możesz użyćfibo().f()
Benyamin Jafari

Odpowiedzi:

179

OK, po pierwsze, nie musisz pobierać odwołania do modułu pod inną nazwą; masz już odniesienie (z import) i możesz go po prostu użyć. Jeśli chcesz mieć inną nazwę, po prostu użyj import swineflu as f.

Po drugie, zamiast tworzyć instancję klasy, otrzymujesz odwołanie do klasy.

Więc to powinno być:

import swineflu

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

Związany sposób to taki, który jest zamocowany na przykład obiektu. Niezwiązanego sposób jest oczywiście taki, który jest nie przyłączony do przypadku. Ten błąd zwykle oznacza, że ​​wywołujesz metodę na klasie, a nie na instancji, co jest dokładnie tym, co działo się w tym przypadku, ponieważ nie utworzyłeś instancji klasy.

kindall
źródło
1
Możesz też to zrobić, swineflu.fibo().f()jeśli dzwonisz tylko raz.
Kit
81

Jak odtworzyć ten błąd z jak najmniejszą liczbą wierszy:

>>> class C:
...   def f(self):
...     print "hi"
...
>>> C.f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method f() must be called with C instance as 
first argument (got nothing instead)

Nie udaje się z powodu TypeError, ponieważ najpierw nie utworzyłeś instancji klasy, masz dwie możliwości: 1: albo uczyń metodę statyczną, aby można było ją uruchomić w sposób statyczny, lub 2: utwórz instancję klasy, aby mieć instancję do pobrania na, aby uruchomić metodę.

Wygląda na to, że chcesz uruchomić metodę w sposób statyczny, wykonaj następujące czynności:

>>> class C:
...   @staticmethod
...   def f():
...     print "hi"
...
>>> C.f()
hi

Lub prawdopodobnie chodziło Ci o użycie instancji, której instancja została utworzona w następujący sposób:

>>> class C:
...   def f(self):
...     print "hi"
...
>>> c1 = C()
>>> c1.f()
hi
>>> C().f()
hi

Jeśli to cię zmyli, zadaj następujące pytania:

  1. Jaka jest różnica między zachowaniem metody statycznej a zachowaniem metody normalnej?
  2. Co to znaczy utworzyć instancję klasy?
  3. Różnice między sposobem uruchamiania metod statycznych a metodami zwykłymi.
  4. Różnice między klasą a przedmiotem.
Eric Leschinski
źródło
Utworzyłem wystąpienie mojej klasy, ale działa tylko wtedy, gdy używam @staticmethod. Czy można to wyjaśnić?
abeltre1
9

fibo = f.fiboodwołuje się do samej klasy. Prawdopodobnie chciałeś fibo = f.fibo()(zwróć uwagę na nawiasy), aby utworzyć instancję klasy, po czym fibo.f()powinna się powieść.

f.fibo.f()zawodzi, ponieważ zasadniczo dzwonisz f(self, a=0)bez dostarczania self; selfjest "wiązany" automatycznie, gdy masz instancję klasy.

Mark Rushakoff
źródło
4

fjest metodą (instancji). Jednak wywołujesz go przez fibo.f, gdzie fibojest obiektem klasy. W związku z tym fjest niezwiązany (nie jest powiązany z żadną instancją klasy).

Jeśli tak

a = fibo()
a.f()

wtedy to fjest związane (z instancją a).

lijie
źródło
2
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`. 

Oto dobry samouczek ułatwiający rozpoczęcie zajęć w Pythonie.

user225312
źródło
2

W Pythonie 2 (3 ma inną składnię):

Co się stanie, jeśli nie możesz utworzyć instancji klasy Parent, zanim będziesz musiał wywołać jedną z jej metod?

Służy super(ChildClass, self).method()do uzyskiwania dostępu do metod nadrzędnych.

class ParentClass(object):
    def method_to_call(self, arg_1):
        print arg_1

class ChildClass(ParentClass):
    def do_thing(self):
        super(ChildClass, self).method_to_call('my arg')
Peter Graham
źródło
0

Różnice w wersji Pythona 2 i 3:

Jeśli masz już domyślną metodę w klasie o tej samej nazwie i ponownie zadeklarujesz ją jako tę samą nazwę, pojawi się ona jako niezwiązane wywołanie metody tej instancji klasy, gdy chcesz ją utworzyć.

Jeśli potrzebujesz metod klasowych, ale zamiast tego zadeklarowałeś je jako metody instancji.

Metoda instancji to metoda używana podczas tworzenia instancji klasy.

Przykładem może być

   def user_group(self):   #This is an instance method
        return "instance method returning group"

Metoda etykiety klas:

   @classmethod
   def user_group(groups):   #This is an class-label method
        return "class method returning group"

W wersji Pythona 2 i 3 różnią się klasą @classmethod do zapisu w Pythonie 3, automatycznie otrzymuje to jako metodę etykiety klasy i nie trzeba pisać @classmethod Myślę, że to może ci pomóc.

Projesh Bhoumik
źródło
0

Spróbuj tego. W przypadku Pythona 2.7.12 musimy zdefiniować konstruktor lub dodać self do każdej metody, a następnie zdefiniować instancję klasy o nazwie object.

import cv2

class calculator:

#   def __init__(self):

def multiply(self, a, b):
    x= a*b
    print(x)

def subtract(self, a,b):
    x = a-b
    print(x)

def add(self, a,b):
    x = a+b
    print(x)

def div(self, a,b):
    x = a/b
    print(x)

 calc = calculator()
 calc.multiply(2,3)
 calc.add(2,3)
 calc.div(10,5)
 calc.subtract(2,3)
NIKHIL BHALODIYA
źródło