2010-08-02 98 views
1

從深入Python:Python類變量或類變量一般

類屬性既可以通過直接參考 類和通過類的任何實例。

類屬性可以用作類級別的常量,但它們不是真正的常量,而是 。你也可以改變它們。

所以我鍵入此爲IDLE:

IDLE 2.6.5  
>>> class c: 
     counter=0 


>>> c 
<class __main__.c at 0xb64cb1dc> 
>>> v=c() 
>>> v.__class__ 
<class __main__.c at 0xb64cb1dc> 
>>> v.counter += 1 
>>> v.counter 
1 
>>> c.counter 
0 
>>> 

那我做錯了嗎?爲什麼類變量不能通過直接引用類和類的任何實例來維護它的值。

+0

由於c.counter仍然是0,你顯然沒有改變它的值。你沒有改變v實例的計數器屬性的值。 – 2010-08-02 15:27:44

+0

你在尋找「靜態類變量」,我想。可能是http:// stackoverflow的副本。com/questions/68645/static-class-variables-in-python – 2010-08-02 15:31:00

回答

8

由於int爲在python不可改變

v.counter += 1 

重新綁定v.counter到新的int對象。重新綁定創建一個實例屬性掩蓋階級屬性

你可以看到這種情況出現,如果你看一下v.counter

>>> id(v.counter) 
149265780 
>>> v.counter+=1 
>>> id(v.counter) 
149265768 

這裏id()你可以看到v現在已經在其__dict__

一個新的屬性
>>> v=c() 
>>> v.__dict__ 
{} 
>>> v.counter+=1 
>>> v.__dict__ 
{'counter': 1} 

對比度其中counter是可變的情況下,例如一個list

>>> class c: 
... counter=[] 
... 
>>> v=c() 
>>> v.counter+=[1] 
>>> c.counter 
[1] 
>>> 
+0

我會把它:一個新的int對象...到'v.counter' – 2010-08-02 15:26:15

+0

真棒,謝謝! – user284094 2010-08-02 15:28:31

0

您在聲明實例化之間感到困惑。

C是您聲明的類的名稱。

v是一個對象,從c實例化。

+0

這不是混淆的地方。如果你在一個類上設置了一個變量,你可以按照上面的方式正確讀取它:instance.classvariable。 – 2010-08-02 15:31:19

0

前:

c.counter = 0 
v.counter -> c.counter 

在:

c.counter = 0 
v.counter = c.counter + 1 

後:

c.counter = 0 
v.counter = 1 
0

請注意,您仍然可以在類值:

v.__class__.__dict__['counter'] 

將允許您閱讀或設置您的課程,即使您已通過向您的實例的__dict__添加符號來遮蔽了符號。