在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
这个错误是什么意思?导致此错误的原因是什么?
答案 0 :(得分:171)
好的,首先,您不必将模块的引用转换为其他名称;你已经有了一个参考(来自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
绑定方法是附加到对象实例的方法。 未绑定方法当然是不附加到实例的方法。该错误通常意味着您在类而不是实例上调用该方法,这正是在这种情况下发生的事情,因为您没有实例化该类。
答案 1 :(得分:77)
>>> 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
如果这让您感到困惑,请提出以下问题:
答案 2 :(得分:9)
fibo = f.fibo
引用了类本身。您可能希望fibo = f.fibo()
(注意括号)使类的实例,之后fibo.f()
应该正确成功。
f.fibo.f()
失败,因为您基本上在不提供f(self, a=0)
的情况下致电self
;当你有一个类的实例时,self
会自动“绑定”。
答案 3 :(得分:3)
f
是一个(实例)方法。但是,您通过fibo.f
调用它,其中fibo
是类对象。因此,f
未绑定(未绑定到任何类实例)。
如果你做了
a = fibo()
a.f()
然后绑定f
(到实例a
)。
答案 4 :(得分:2)
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`.
Here是一个很好的Python教程。
答案 5 :(得分:2)
在Python 2中(3有不同的语法):
如果在需要调用其中一种方法之前无法实例化您的Parent类,该怎么办?
使用pip install pip --upgrade
访问父方法。
super(ChildClass, self).method()
答案 6 :(得分:0)
在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版本中,不同类@classmethod要写 在python 3中,它自动将其作为类标签方法获取,而不需要编写@classmethod 我想这可能会对你有帮助。
答案 7 :(得分:0)
尝试一下。对于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)