несвязанный метод f () должен быть вызван с экземпляром fibo_ в качестве первого аргумента (вместо этого получен экземпляр classobj) - PullRequest
136 голосов
/ 17 декабря 2010

В Python я пытаюсь запустить метод в классе и получаю сообщение об ошибке:

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)

Код: (swineflu.py)

class fibo:
    a=0
    b=0

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

Скрипт main.py

import swineflu

f = swineflu
fibo = f.fibo

fibo.f()            #TypeError is thrown here

Что означает эта ошибка? Что вызывает эту ошибку?

Ответы [ 8 ]

172 голосов
/ 17 декабря 2010

ОК, во-первых, вам не нужно указывать ссылку на модуль под другим именем;у вас уже есть ссылка (из import), и вы можете просто использовать ее.Если вы хотите другое имя, просто используйте import swineflu as f.

Во-вторых, вы получаете ссылку на класс, а не на создание экземпляра класса.

Так что это должно быть:

import swineflu

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

связанный метод - это метод, привязанный к экземпляру объекта. несвязанный метод - это, конечно, метод, который не привязан к экземпляру.Ошибка обычно означает, что вы вызываете метод в классе, а не в экземпляре, что и происходит в данном случае, потому что вы не создали экземпляр класса.

79 голосов
/ 07 ноября 2014

Как воспроизвести эту ошибку с как можно меньшим количеством строк:

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

Сбой из-за TypeError, потому что вы сначала не создали экземпляр класса, у вас есть два варианта: 1: либо создать методstatic, чтобы вы могли запустить его статическим способом, или 2: создать экземпляр своего класса, чтобы у вас был экземпляр для запуска метода.

Похоже, вы хотите запустить метод встатическим способом, сделайте это:

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

Или, что вы, вероятно, имели в виду, это использование экземпляра экземпляра, как это:

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

Если вас это смущает, задайте следующие вопросы:

  1. В чем разница между поведением статического метода и поведением обычного метода?
  2. Что делаетэто означает создать экземпляр класса?
  3. Различия между тем, как выполняются статические методы, по сравнению с обычными методами.
  4. Различия между классом и объектом.
9 голосов
/ 17 декабря 2010

fibo = f.fibo ссылается на сам класс. Вы, вероятно, хотели, чтобы fibo = f.fibo() (обратите внимание на круглые скобки) сделал экземпляром класса, после которого fibo.f() должен успешно работать.

f.fibo.f() терпит неудачу, потому что вы, по сути, звоните f(self, a=0) без предоставления self; self «привязывается» автоматически, когда у вас есть экземпляр класса.

3 голосов
/ 17 декабря 2010

f - это метод (экземпляр).Однако вы вызываете его через fibo.f, где fibo - это объект класса.Следовательно, f не связан (не привязан ни к какому экземпляру класса).

Если вы сделали

a = fibo()
a.f()

, тогда этот f привязан (к экземпляру a).

2 голосов
/ 30 января 2017

В Python 2 (3 имеет другой синтаксис):

Что если вы не можете создать экземпляр своего класса Parent до того, как вам потребуется вызвать один из его методов?

Используйте super(ChildClass, self).method() для доступа к родительским методам.

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')
2 голосов
/ 17 декабря 2010
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`. 

Здесь - хороший учебник для начала работы с классами в Python.

0 голосов
/ 18 октября 2018

Попробуй это. Для python 2.7.12 нам нужно определить конструктор или добавить self в каждый метод, а затем определить экземпляр класса с именем 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)
0 голосов
/ 10 августа 2017

Различия в версии Python 2 и 3:

Если у вас уже есть метод по умолчанию в классе с тем же именем, и вы повторно объявляете его под тем же именем, он будет отображаться как вызов unbound-метода этого экземпляра класса, когда вы захотите создать его экземпляр.

Если вы хотели методы класса, но вместо этого вы объявили их как методы экземпляра.

Метод экземпляра - это метод, который используется при создании экземпляра класса.

Примером будет

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

Метод метки класса:

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

В Python 2 и 3 версии отличаются класс @classmethod для записи в Python 3 он автоматически получает это как метод метки класса и не должен писать @classmethod Я думаю, что это может помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...