2015-12-18 67 views
0

我想維護A和B對象的計數,B是從A繼承而來的。因此計數應該是特定於A和B.例如,如果我創建3個A對象並且2 B對象,由於構造函數調用,計數A變爲3 + 2 = 5,但我想保留爲3(不作爲B的一部分用作子對象時)。在下面的代碼片段請評論:Python中完整對象和子對象的計數

class A: 
    acount = 0 # class variable 
    def __init__(self, isFullA = True): 
     if (isFullA): 
      self.iamFullA = True 
      A.acount += 1 
     else: 
      self.iamFullA = False 
    def __del__(self): 
     if (self.iamFullA): 
      A.acount -= 1 

class B(A): 
    bcount = 0 # class variable 
    def __init__(self, isFullB = True): 
     A.__init__(self,False) 
     if (isFullB): 
      self.iamFullB = True 
      B.bcount += 1 
     else: 
      self.iamFullB = False 
    def __del__(self): 
     if (self.iamFullB): 
      B.bcount -= 1 
#MAIN 
L=[] 
for i in range(3): 
    L.append(A()) 
for i in range(2): 
    L.append(B()) 
print "A.acount = " + str(A.acount) 
print "B.bcount = " + str(B.bcount) 

輸出是:

A.acount = 3 
B.bcount = 2 
+1

那麼,什麼是你的問題?如果您只想要查看代碼,請訪問http://codereview.stackexchange.com/。 – Holt

+0

如果isinstance(self,A):A.acount + = 1'? – Pynchia

回答

0

你做它的方式複雜 - 所有你需要的是有針對每個類別不同count類屬性:

class A(object): 
    _counter = 0 

    @classmethod 
    def _inc(cls): 
     cls._counter += 1 

    @classmethod 
    def _dec(cls): 
     cls._counter -= 1 

    @classmethod 
    def get_count(cls): 
     return cls._counter 

    def __init__(self): 
     self._inc() 

    def __del__(self): 
     self._dec() 


class B(A): 
    _counter = 0 

    def __init__(self, wot): 
     super(B, self).__init__() 
     self.wot = wot 

L=[] 
for i in range(3): 
    L.append(A()) 
for i in range(2): 
    L.append(B(i)) 
print "A.count = {}".format(A.get_count()) 
print "B.count = {}".format(B.get_count()) 

注意我用了classmethods,以確保我們所訪問的類屬性,如self._counter += 1__init__會創建一個實例屬性。您也可以使用type(self)._counter += 1(或self.__class__._counter += 1)獲得正確的行爲,但這有點醜陋。

如果這是一個API,開發者等將建立在,你可能需要使用自定義的元類,以確保每個子類都有它自己的_counter,即:

class CounterType(type): 
    def __new__(meta, name, bases, attribs): 
     if "_counter" not in attribs: 
      attribs["_counter"] = 0 
     return type.__new__(meta, name, bases, attribs) 

class CounterBase(object): 
    __metaclass__ = CounterType 
    @classmethod 
    def _inc(cls): 
     cls._counter += 1 

    @classmethod 
    def _dec(cls): 
     cls._counter -= 1 

    @classmethod 
    def get_count(cls): 
     return cls._counter 

    def __init__(self): 
     self._inc() 

    def __del__(self): 
     self._dec() 


class A(CounterBase): 
    pass 


class B(A): 
    def __init__(self, wot): 
     super(B, self).__init__() 
     self.wot = wot 

L=[] 
for i in range(3): 
    L.append(A()) 
for i in range(2): 
    L.append(B(i)) 
print "A.count = {}".format(A.get_count()) 
print "B.count = {}".format(B.get_count())