未绑定方法f()必须以fibo_实例作为第一个参数调用(取而代之的是class classobj实例)


139

在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

这个错误是什么意思?是什么导致此错误?


1
您是否要实例化对象?
托马斯

2
类名应大写。
CDT

1
fibo = f.fibo()需要用方括号实例化该类。
Kotlinboy

您可以使用fibo().f()
Benyamin Jafari

Answers:


179

好的,首先,您不必以其他名称引用模块。您已经有一个参考(来自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

绑定的方法是一个被附加到对象的实例。的未结合的方法是,当然,一个是附连到一个实例。该错误通常意味着您是在类而不是实例上调用该方法,这正是在这种情况下发生的事情,因为您尚未实例化该类。


1
swineflu.fibo().f()如果只调用一次,您也可以这样做。
套件

81

如何用尽可能少的行来重现此错误:

>>> 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:将方法设为静态以便可以以静态方式运行它;或者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. 类和对象之间的差异。

我已经实例化了我的课程,但是它仅在使用@staticmethod时有效。可以解释吗?
abeltre1

9

fibo = f.fibo引用类本身。您可能希望fibo = f.fibo()(请注意括号)成为该类的实例,之后fibo.f()应该可以成功完成。

f.fibo.f()之所以失败,是因为您本质上f(self, a=0)没有打电话就打电话self; self当您拥有该类的实例时,它会自动“绑定”。


4

f是(实例)方法。但是,您是通过调用它的fibo.f,那里fibo是类对象。因此,f是unbound(不绑定到任何类实例)。

如果你做了

a = fibo()
a.f()

然后将f其绑定到(实例a)。


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`. 

是入门Python类的好教程。


2

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

0

在python 2和3版本中的差异:

如果您已经在具有相同名称的类中使用默认方法,并且重新声明为相同名称,则当您要实例化该实例时,它将作为该类实例的未绑定方法调用出现。

如果您想要类方法,但是您将它们声明为实例方法。

实例方法是在创建类的实例时使用的方法。

一个例子是

   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版本中,要在python 3中编写的类@classmethod有所不同,它会自动将其作为类标签方法获取,而无需编写@classmethod,我认为这可能对您有所帮助。


0

试试这个。对于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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.