2015-07-10 110 views
1

我想將一個列表定義爲類內的實例變量,但它充當類變量。Python類實例與類變量

class THING: 
    def __init__(self, name, stuff): 
     self.name = name 
     self.dict = [] 
     for item in stuff: 
      self.dict.append(item) 

    def getname(self): 
     return self.name 

    def getlist(self): 
     return self.dict 

    def inc_datecnt(self,date): 
     for item in self.dict: 
      if item.has_key(date): 
       item[date] += 1 



list = [] 
dates=['July1,2015', 'July2,2015', 'July3,2015'] 
datecnts = [] 
for date in dates: 
    datecnts.append({date : 0}) 

list.append(THING('A', datecnts)) 
list.append(THING('B', datecnts)) 


for item in list: 
    print "\n", item.getname() 
    item.inc_datecnt('July1,2015') 
    for subitem in item.getlist(): 
     print subitem 

當我執行此我得到:

A 
{'July1,2015': 1} 
{'July2,2015': 0} 
{'July3,2015': 0} 

B 
{'July1,2015': 2} 
{'July2,2015': 0} 
{'July3,2015': 0} 

我似乎增加一個類字典元素July1,2015當我想(和期望)是增加一個實例變量。

幫助

+1

你重用'datecnts'構建THING'的'的兩個實例,並且當你創建了一個新的列表中的'dict'內兩者之間的相同。 – metatoaster

+0

也許你可以打印類型(項目),以確保對象是THING,而不是dict – ytpillai

+0

Python並不完全有辦法打印出來,所以如果你需要做一個'def __str __(self)'只想打印出變量 – ytpillai

回答

1

你逝去的datecnts列表您THING對象的構造函數,你只是路過的參考值(和列表是可變的,字典是可變的),因此,如果您對字典的任何更改爲A THING對象,它會反映在B,因爲B也有同樣的參考。您應該嘗試執行datecntscopy.deepcopy,並將其分別發送至AB

示例 -

import copy 
list.append(THING('A', copy.deepcopy(datecnts))) 
list.append(THING('B', copy.deepcopy(datecnts))) 
+0

ahhhhh ....現在我明白了。 –

+1

請記住接受答案,如果有幫助的話,這對社區會有幫助。 –

+0

接受答案是單擊左側的刻度線。 –