0

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

我仍然不清楚绑定/未绑定的工作原理。很抱歉初学者的问题,任何帮助将不胜感激。

4

2 回答 2

1

您的代码存在以下问题:

  • 缩进问题。您定义的任何需要绑定到类(即属于该类)的变量或方法都需要在该类下缩进一级。
  • 需要在status=staticmethod(status)类下直接定义,不在status()方法定义的范围内。由于status是指Critter.status()
  • 至少根据您显示的调用,该status()方法不应采用任何参数。xCritter.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
于 2013-03-22T04:17:03.933 回答
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 中的类方法差异:绑定、未绑定和静态

于 2013-03-22T04:15:33.043 回答