未绑定的 f() 方法必须以 fibo_ 实例作为第一个参数(而是得到了 classobj 实例)
在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
如果这些让你感到困惑,可以问自己以下问题:
- 静态方法和普通方法的行为有什么区别?
- 创建类的实例是什么意思?
- 静态方法和普通方法的运行方式有什么不同?
- 类和对象之间有什么区别?
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
一个绑定方法是指和某个对象实例关联的方法。而未绑定方法则是没有和任何实例关联的方法。这个错误通常意味着你是在类上调用方法,而不是在实例上调用,这正是你遇到的问题,因为你还没有创建这个类的实例。