未绑定的 f() 方法必须以 fibo_ 实例作为第一个参数(而是得到了 classobj 实例)

142 投票
8 回答
314616 浏览
提问于 2025-04-16 08:41

在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 个回答

11

fibo = f.fibo 是在引用这个类本身。你可能想要的是 fibo = f.fibo()(注意有括号),这样才能创建这个类的一个实例,之后调用 fibo.f() 就能正常工作了。

f.fibo.f() 之所以失败,是因为你实际上是在调用 f(self, a=0),但是没有提供 self;当你有这个类的实例时,self 会自动“绑定”上去。

83

如何用尽可能少的代码行复现这个错误:

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

这个错误是因为你没有先创建类的实例,所以出现了类型错误。你有两个选择:第一,可以把这个方法设为静态的,这样就可以直接调用;第二,创建这个类的实例,这样就有一个对象可以用来调用这个方法。

看起来你想以静态方式运行这个方法,可以这样做:

>>> 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. 类和对象之间有什么区别?
182

首先,你不需要把模块的引用改成其他名字;你已经通过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

一个绑定方法是指和某个对象实例关联的方法。而未绑定方法则是没有和任何实例关联的方法。这个错误通常意味着你是在类上调用方法,而不是在实例上调用,这正是你遇到的问题,因为你还没有创建这个类的实例。

撰写回答