Python 2.7 初学者错误:未绑定方法

0 投票
2 回答
2560 浏览
提问于 2025-04-17 19:57

我刚开始学习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

撰写回答