2017-04-13 58 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