2013-03-22 56 views
0

我刚开始学习Python和同时了解 班最近遇到的一个问题。 请看看代码。的Python 2.7初学者的错误:不受约束的方法

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) 

我还是不清楚如何绑定/未绑定的作品。对于初学者问题抱歉,任何帮助将不胜感激。

+0

http:// ww w.daniweb.com/software-development/python/threads/242080/understanding-static-methods – perreal 2013-03-22 04:46:55

回答

1

你的代码存在以下问题:

  • 压痕问题。您定义的任何需要绑定到类的变量或方法(即属于类)都需要在类下缩进一层。
  • status=staticmethod(status)需要直接在类下定义,而不是在status()方法定义的范围内。由于status指的是Critter.status()
  • status()方法不应该采用任何参数x至少根据您所示的Critter.status()调用。

你看到上面的错误表示蟒蛇没认出你的类定义的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 
+0

啊,我看到非常感谢你的帮助!我会再回来更新我的进度! – user2197773 2013-03-22 05:41:08

0

Chnage您的代码:

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 

要了解更多关于绑定和非绑定方法尝试读取这个Class method differences in Python: bound, unbound and static

+0

我不认为这是什么OP需要。什么是status = staticmethod(status)'试图在这里完成? – mgilson 2013-03-22 04:18:44

+0

更改我的代码 – 2013-03-22 04:19:25

+0

我不知道为什么有人对这些进行了降级。也许他们觉得像classmethod会更合适?但我不认为你可以在这里作出判断...... – mgilson 2013-03-22 04:23:27