取消绑定的方法 f()必须用 fibo_instance 作为第一个参数调用(而是使用 classsobj instance)

在 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

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

308145 次浏览

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

f.fibo.f()失败是因为您实际上是在调用 f(self, a=0)而没有提供 self; 当您拥有类的实例时,self会自动“绑定”。

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

如果你有的话

a = fibo()
a.f()

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

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 中的类入手。

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

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

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

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

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

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版本中不同的是 class@classmethod 要写 在 python3中,它会自动获得这个类标签方法,而不需要编写@classmethod 我觉得这个能帮到你。

试试这个。对于 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)