必须使用fibo_ instance作为第一个参数调用unbound方法f()(而不是使用classobj实例)

Dom*_*WTF 137 python methods

在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)
Run Code Online (Sandbox Code Playgroud)

代码:(swineflu.py)

class fibo:
    a=0
    b=0

    def f(self,a=0):
        print fibo.b+a
        b=a;
        return self(a+1)
Run Code Online (Sandbox Code Playgroud)

脚本main.py

import swineflu

f = swineflu
fibo = f.fibo

fibo.f()            #TypeError is thrown here
Run Code Online (Sandbox Code Playgroud)

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

kin*_*all 176

好的,首先,您不必将模块的引用转换为其他名称; 你已经有了一个参考(来自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
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你只调用一次,你也可以做 `swineflu.fibo().f()`。 (2认同)

Eri*_*ski 79

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

>>> 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)
Run Code Online (Sandbox Code Playgroud)

它因TypeError而失败,因为你没有先实例化该类,你有两个选择:1:要么使方法静态,要么你可以以静态方式运行它,或者2:实例化你的类,这样你就有了一个实例来抓取它上,运行该方法.

看起来您想以静态方式运行该方法,请执行以下操作:

>>> class C:
...   @staticmethod
...   def f():
...     print "hi"
...
>>> C.f()
hi
Run Code Online (Sandbox Code Playgroud)

或者,你可能意味着使用这样的实例化实例:

>>> class C:
...   def f(self):
...     print "hi"
...
>>> c1 = C()
>>> c1.f()
hi
>>> C().f()
hi
Run Code Online (Sandbox Code Playgroud)

如果这让您感到困惑,请提出以下问题:

  1. 静态方法的行为与普通方法的行为有什么区别?
  2. 实例化一个类是什么意思?
  3. 静态方法运行方式与常规方法之间的差异.
  4. 类和对象之间的差异.


Mar*_*off 9

fibo = f.fibo引用类本身.您可能希望fibo = f.fibo()(注意括号)创建类的实例,之后fibo.f()应该正确成功.

f.fibo.f()失败,因为你基本上是在调用f(self, a=0)无供应self; self当你有一个类的实例时,它会自动"绑定".


lij*_*jie 7

f是一个(实例)方法。但是,您通过 调用它fibo.ffibo其中类对象在哪里。因此,f是未绑定的(不绑定到任何类实例)。

如果你这样做了

a = fibo()
a.f()
Run Code Online (Sandbox Code Playgroud)

然后它f被绑定(到实例a)。