2013-06-29 57 views
4

我是新來的python,我不知道這是如何工作。代碼如下:類變量比。 python中的實例變量int值

class test(): 
    d=0 
    def __init__(self): 
     self.d=self.d+1; 

D=test() 
print D.d 
D1=test() 
print D1.d 
D2=test() 
print D2.d 

輸出是

1,1,1 # This should not be 

現在用這樣的:

class test(): 
    d=[] 
    def __init__(self): 
     self.d.apend("1"); 

D=test() 
print D.d 
D1=test() 
print D1.d 
D2=test() 
print D2.d 

結果(這應該是)

['1'] 
['1', '1'] 
['1', '1', '1'] 

,所以我不確定爲什麼整數值不被視爲當列表正在處理時,類變量。

+0

爲什麼使用舊式課程? – Marcin

+0

@spgc我是新人,請告訴我新的風格。 –

+0

看到我的答案。它涵蓋了這一點。 – Marcin

回答

3

在第一示例中,

self.d = self.d + 1 

重新綁定self.d,使其成爲獨立的test.d

在第二示例中,

self.d.append("1") 

修改test.d

要親自看到,請在兩個構造函數的最後打印id(self.d)

如果修改了第二個例子,以匹配第一:

self.d = self.d + ["1"] 

你會看到該行爲也將相應改變。

+0

爲什麼它在第二個修改,而不是在第一個。我想它應該在兩種情況下都是一樣的,因爲每個運營商都使用它 –

+0

@bimleshsharma這不是同一個操作符。一個是分配,一個不是。 – Marcin

+0

@Marcin是的,ID是不同的。 –

0

爲了解決一類變量使用class_name.variable_name,贈送:

class test(object): 
    d=0 
    def __init__(self): 
     test.d = test.d + 1; 
+0

這是錯誤的。見NPE的答案。 – Marcin

+1

@Marcin,請解釋一下。 – voscausa

+0

(a)如果名稱沒有被實例變量遮蔽,那麼'x = self.d'將指出類變量'd'(b)這不是分配給類變量(c)的唯一方法,這是分配給類變量的錯誤方式,因爲如果類名更改,則需要更改對名稱的所有引用。 – Marcin

3

如果你想修改類變量,這樣做:

class test(object): 
    d=0 
    def __init__(self): 
     type(self).d=self.d+1; 

D=test() 
print D.d 
D1=test() 
print D1.d 
D2=test() 
print D2.d 

你並不需要在該type賦值的右側,因爲這樣你永遠不會創建一個實例變量d。請注意,新風格的類是必要的。

type是一個函數(實際上是可調用的 - 它也是一個類,但現在不用擔心)返回它的參數類。所以,type(self)返回self的類。類是Python中的第一類對象。

演示在這裏:http://ideone.com/JdNpiV

更新:另一種方法是使用classmethod

0

NPE的答案告訴你你的代碼出了什麼問題。但是,我不確定它是否真的告訴你如何正確解決問題。

這裏就是我想你想,如果每個test實例應該有一個實例變量不同d值:

class test(object): # new style class, since we inherit from "object" 
    _d = 0 # this is a class variable, which I've named _d to avoid confusion 

    def __init__(self): 
     self.d = test._d # assign current value of class variable to an instance variable 
     test._d += 1  # increment the class variable 

現在,你可以創建多個實例,每個人都會得到d一個獨特的價值:

>>> D0 = test() 
>>> D1 = test() 
>>> D2 = test() 
>>> print D0.d 
0 
>>> print D1.d 
1 
>>> print D2.d 
2