Python 2.7 初学者错误:未绑定方法
我刚开始学习Python,最近在学习类的时候遇到了一个问题。请看看这段代码。
class Critter(object):
"""your very own bug generator"""
total=0
def status(x):
print Critter.total
status=staticmethod(status)
def __init__(self,name):
print'a critter has been created'
self.name=name
Critter.total+=1
crit1=Critter('pooch')
crit2=Critter('Duff')
crit3=Critter('pluto')
Critter.status()
print'\nAccessing the class attributes through an object:',crit1.total
运行这段代码时,我遇到了这个错误:
line 19, in <module>
Critter.status(Critter.total)
TypeError: unbound method status() must be called with Critter instance as first
argument(got int instance instead)
我对绑定和未绑定的概念还是不太明白。抱歉问了个初学者的问题,任何帮助都非常感谢。
2 个回答
0
把你的代码改成这样:
class Critter(object):
"""your very own bug generator"""
total = 0
@staticmethod
def status():
print Critter.total
def __init__(self,name):
print 'a critter has been created'
self.name = name
Critter.total += 1
想了解更多关于绑定方法和非绑定方法的内容,可以看看这个 Python中的类方法区别:绑定、非绑定和静态
1
你的代码有以下几个问题:
- 缩进问题。任何你定义的变量或方法,如果需要和一个类绑定(也就是说,属于这个类),都需要在类下面缩进一个层级。
status=staticmethod(status)
需要直接在类下面定义,而不是在status()
方法的定义范围内。因为status
是指Critter.status()
。status()
方法不应该接受任何参数x
,至少根据你展示的Critter.status()
调用来看是这样的。
你看到的上述错误表示,Python 没有识别到你在类定义中的 staticmethod
调用,因为它的缩进不正确。所以 Python 只是把 status()
方法定义成了一个普通的实例方法(这是默认的)。对于实例方法,Python 期望第一个参数是实例的引用。
这样做应该可以:
class Critter(object):
"""your very own bug generator"""
total=0
def status():
print Critter.total
status=staticmethod(status)
def __init__(self,name):
print 'a critter has been created'
self.name=name
Critter.total+=1
crit1=Critter('pooch')
crit2=Critter('Duff')
crit3=Critter('pluto')
Critter.status()
print'\nAccessing the class attributes through an object:',crit1.total
输出:
a critter has been created
a critter has been created
a critter has been created
3
Accessing the class attributes through an object: 3
如果你使用的是 Python 版本大于 2.4(这很可能是你的情况),你可以使用 @staticmethod
装饰器来定义静态方法,方法如下:
class Critter(object):
"""your very own bug generator"""
total=0
@staticmethod
def status():
print Critter.total
def __init__(self,name):
print 'a critter has been created'
self.name=name
Critter.total+=1