2012-03-20 43 views
8

我是python新手,並且類的成員變量在我的python代碼中工作怪異。有些作品像普通變量一樣,但有些作品像靜態變量!python成員變量的實例像成員變量一樣工作,有些工程像靜態變量

class Chaos: 
    list_value = [] 
    value = "default" 

    def set_value(self, word): 
     self.list_value.append(word) 
     self.value = word 

    def show(self, num): 
     print(str(num) + "====") 
     print("value : " + self.value) 
     for st in self.list_value: 
      sys.stdout.write(st) 
     print("\n=====\n") 

a = Chaos() 
a.show(0) 
a.set_value("A") 
a.show(1) 
b = Chaos() 
a.show(2) 
b.show(3) 

結果

0==== 
value : default 

===== 

1==== 
value : A 
A 
===== 

2==== 
value : A 
A 
===== 

3==== 
value : default 
A 
===== 

,但測試的最終結果跟我想象中的最後一次測試不同。 'b'實例的'list_value'中不應該有「A」。 它剛剛創建,從未添加過'A'。 我向'a'的實例添加'A',而不是'b'。 但是結果表明,'b'中也有'A' 此外,類中的'list_value'和'value'的工作方式不同。 它看起來像兩個具有相同的語法。他們爲什麼工作不同?

+4

[爲什麼要記住類屬性?](http://stackoverflow.com/questions/9713259/why-class-attribute-is-remembered) – 2012-03-20 04:30:33

回答

17

這些實際上是類變量。要創建實例變量初始化它們在__init__功能:

class Chaos: 
    def __init__(self): 
     self.list_value = [] 
     self.value = "default" 

原因value的行爲就像實例變量,是因爲你使用self.value設置它。當Python看到self.X時,它會查看對象中是否有屬性X,如果沒有,則會查看其類。由於您從未設置過self.list_value,因此它將訪問所有實例之間共享的類變量,因此任何修改都會反映到其他每個對象中。

3

關鍵區別在於您要追加到list_value,並且您正在分配到value。他們被稱爲「類變量」。每個實例都有自己對類變量的引用,這就是共享列表的原因。但是,在分配時,您正在將該實例的引用更改爲指向另一個變量,這解釋了value的行爲。

如果您正在尋找來自list_value的實例變量行爲,請將其初始化爲構造函數(稱爲__init__的類方法)。