2014-08-31 38 views
2

我想計算Python3.x中自定義類及其子類的實例數。怎麼做?非常感謝你。如何計算自定義類的實例數量?

我試過類成員的方式,但它不起作用。以下是碼

Base.py

class Base: 

    ## class members 
    __counter = int(0) 
    @classmethod 
    def _count(cls): 
     cls.__counter += 1 
     return cls.__counter 

    def __init__(self): 
     self.__id = self._count() 

    @property 
    def id(self): 
     return self.__id 

SubBase1.py

from Base import Base 

class SubBase1(Base): 
    def __init__(self): 
     Base.__init__(self) 

SubBase2.py

from Base import Base 

class SubBase2(Base): 
    def __init__(self): 
     Base.__init__(self) 

main.py

from SubBase1 import SubBase1 
from SubBase2 import SubBase2 

s1 = SubBase1() 
s2 = SubBase2() 

print('s1-id', s1.id) 
print('s2-id', s2.id) 

的代碼輸出:

s1-id 1 
s2-id 1 

但是,我要的是:

s1-id 1 
s2-id 2 

我該怎麼辦?首先非常感謝! PS: 環境:Ubuntu的14.04 + Python的3.4 + PyDev的

回答

2

cls設置屬性將設置在子類的一個新屬性。你必須明確地設置該上Base這裏:

class Base: 
    __count = 0 

    @classmethod 
    def _count(cls): 
     Base.__count += 1 
     return Base.__count 

    def __init__(self): 
     self.__id = self._count() 

    @property 
    def id(self): 
     return self.__id 

如果嘗試設置屬性上cls將創建每類獨特的櫃檯,不是所有子類共享。

演示:

>>> class Base: 
...  __count = 0 
...  @classmethod 
...  def _count(cls): 
...   Base.__count += 1 
...   return Base.__count 
...  def __init__(self): 
...   self.__id = self._count() 
...  @property 
...  def id(self): 
...   return self.__id 
... 
>>> class SubBase1(Base): pass 
... 
>>> class SubBase2(Base): pass 
... 
>>> SubBase1().id 
1 
>>> SubBase1().id 
2 
>>> SubBase2().id 
3 
>>> SubBase2().id 
4 
+0

在我的PyDev,它不能很好地工作。但非常感謝。而且,在這裏,我必須將類方法_count(cls)更改爲_counter(cls),以使其正常工作 – 2014-08-31 09:38:06

+0

對不起,它仍然無法正常工作。你的環境是什麼? – 2014-08-31 09:44:15

+0

@ user365489:查看我的更新演示和進一步的解釋。我也在這裏使用了Python 3.4,但我還沒有喝過早茶。 – 2014-08-31 09:44:37

相關問題