必须以fibo_u1;instance作为第一个参数调用未绑定的方法f()(改为get classobj instance)

2024-04-20 12:36:31 发布

您现在位置:Python中文网/ 问答频道 /正文

在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

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


Tags: 方法pyselfmostmain错误callusers
3条回答

fibo = f.fibo引用类本身。您可能希望fibo = f.fibo()(注意括号)使成为类的实例,然后fibo.f()应该正确地成功。

f.fibo.f()失败,因为您本质上是在调用f(self, a=0)而不提供selfself在拥有类实例时自动“绑定”。

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

>>> 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. 类和对象之间的区别。

好的,首先,您不必将对模块的引用换成其他名称;您已经有了一个引用(来自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

绑定方法是附加到对象实例的方法。当然,未绑定方法是附加到实例的而不是方法。这个错误通常意味着您是在类上而不是在实例上调用方法,这正是本例中发生的情况,因为您没有实例化该类。

相关问题 更多 >