2017-04-13 50 views
11

比方说,我们有Python中的宠物类:写引用实例和类都蟒蛇方法

class Pet(object): 
    num_pets = 0 

    def __init__(self, name): 
     self.name = name 
     Pet.num_pets += 1 

    def speak(self): 
     print("My name's %s and the number of pets is %d" % (self.name, self.num_pets)) 

我想INIT方法来创建一个实例,同时也更新属性在课堂上。有没有比上面的代码更优雅的方式来做到这一点?我尝试将selfcls传递给init方法,然后引用cls而不是Pet,其中num_pets递增,但那不起作用。

+4

我看到上面的代码足够优雅。除非'num_pets'是一个按类进行管理的属性。我没有看到任何明显的原因,为什么要考虑在这里使用类方法的需要。 – direprobs

回答

13

你可以使用一个classmethod递增宠物数量:

class Pet(object): 
    num_pets = 0 

    def __init__(self, name): 
     self.name = name 
     self.incr_num_pets() 

    @classmethod 
    def incr_num_pets(cls): 
     cls.num_pets += 1 

另外,还可以增加num_petstype(self)

def __init__(self, name): 
    self.name = name 
    type(self).num_pets += 1 

,虽然我觉得这是第二种方法略显不足优雅是即使它不那么打字。

+0

感谢@mgilson,我喜欢你的第一个解决方案。非常可读! – michberr

4

在你的情况,你可以用__init__一起使用__new__

class Pet(object): 
    num_pets = 0 

    def __new__(cls, *args, **kwargs): 
     cls.num_pets += 1 
     return object.__new__(cls) 

    def __init__(self, name): 
     self.name = name 
1

您可以访问使用self.__class__自己的类,这意味着你的__init__可以是这样的:

def __init__(self, name): 
    self.name = name 
    self.__class__.num_pets += 1 
+0

不错的一个!谢谢! – michberr