2013-05-15 58 views
0

我只是有一個令人費解的問題abou在python中的類屬性。 考慮下面的下面的類:python類屬性:意外的行爲

class A: 
    __lst = [] 
    def add(self, str): 
     self.__lst.append(str) 
     print len(self.__lst) 

我試圖使兩個實例x和y和我得到這個:

>>> x = A() 
>>> x.add('aaa') 
1 
>>> x.add('bbb') 
2 
>>> y = A() 
>>> y.add('aaa') 
3 
>>> y.add('bbb') 
4 

我期待的是y的實例將擁有的單獨副本列表屬性,但似乎即使您使用另一個對象將元素添加到列表中,列表也會變大。這很奇怪。

有沒有人可以在這個問題上給我啓發? 提前感謝您的幫助。 :-)

+2

「我期待y的實例將有一個單獨的列表屬性副本」 - 您爲什麼期望這樣?這是一個班級屬性(你使用這個術語後似乎知道的一個概念),當然它屬於班級,而不是實例。 – millimoose

+1

可能是因爲Python不只是具有不同語法的java –

+0

對不起,我指的是屬性本身,這意味着實例x的列表屬性與實例y的列表屬性無關。 – rbolante

回答

1

如果您在類體內定義了一個屬性,那麼它將是一個類屬性,並且它將被所有實例共享。在您的代碼self.__lst將被作爲A.__lst的參考。

要爲每個屬性單獨的列表,將其定義爲self.__lst__init__()函數中:

class A(object): 
    def __init__(self): 
     self.__lst = [] 

    def add(self, s): 
     self.__lst.append(s) 
     print len(self.__lst) 

除了上面提到的變化,我也做了一些小的修改,以便您的代碼如下幾個Python最佳實踐:從objectnew-style class)繼承而不使用str(或任何其他內置名稱)作爲變量名稱。

+0

它的工作!非常感謝F.J.的幫助:-) – rbolante

0

在類中聲明的變量而不是self是類級別的屬性(例如您的__lst)。它們相當於Java的static。如果您希望您的財產對所有實例都是唯一的,則需要通過self(即self.__lst)聲明它們。