2011-12-20 27 views
-1

引述diveintopython的,類和數據屬性有什麼區別?

「你已經知道了數據屬性,它們是由 類的具體實例所擁有的變量。Python也支持類屬性, 它們是由類本身所擁有的。」

從某種意義上講,類是屬於某個類的?如果您在特定實例中更改類屬性的值,則該更改僅反映在該實例中(而不是在該類的其他實例中)。

從我的觀點來看,這使得類屬性與數據(即實例)屬性基本相同(儘管存在語法差異)。

在C++中更改「類變量」的值,並且該更改反映在所有實例中。

兩者有什麼區別?

+0

攪拌機 - 看起來像你有時間完全重寫我的文章,以取消邊緣,但仍然無法回答它。謝謝? (僅供參考 - 你寫過這個標題的方式,它會被標記爲重複,儘管根據我的理解,這個問題還沒有被回答。) – Mark 2011-12-20 07:40:24

+0

你是什麼意思的「邊緣」?我清理了你的問題,因爲你剛剛開始一個偶然的討論,並沒有問任何具體的問題。如果你不喜歡我的編輯,請回滾到原始狀態。這已被回答[相當多次](http://stackoverflow.com/questions/207000/python-difference-between-class-and-instance-attributes)。 – Blender 2011-12-20 07:43:25

+0

Blender的編輯是一個很大的改進。 – wim 2011-12-20 07:43:59

回答

1

我認爲這個例子會解釋你的意思。

class A(object): 
    bar = 1 

a = A() 
b = A() 
b.bar = 2 
print a.bar # outputs 1 
A.bar = 3 
print a.bar # outputs 3 
print b.bar # outputs 2 

在這種情況下b.bar將由例如b.bar = 2a.bar仍將由類所擁有後所擁有。這就是爲什麼在課堂上改變它後它會被改變,b.bar不會。

+0

OP詢問爲什麼類屬性和數據屬性之間存在*區分*,因爲它們似乎執行相同的任務。 – Blender 2011-12-20 07:45:47

+0

OK ...所以它是一個文字類變量,但只適用於自己沒有修改它的實例。如果一個類變量被修改爲特定的實例,它立即開始行爲像一個實例屬性。不明白這個的目的。 – Mark 2011-12-20 07:46:57

+0

這根本不是「靜態的」。傳統上,類變量應該在所有實例中都是靜態的,因此可以在任何地方進行更改,並且該更改會反映在所有實例中。 python類屬性的這種行爲是微妙而奇怪的(而且看起來毫無意義)。 – Mark 2011-12-20 07:51:58

1

這個問題的this one重複:

>>> class B(object): 
...  foo = 1 
... 
>>> b = B() 
>>> b.__dict__ 
{} 
>>> b.foo = 2 
>>> b.__dict__ 
{'foo': 2} 

當你分配一個值b,你添加一個實例變量;你不會修改類屬性。

+0

它不是重複的,只是因爲它提到了「class attribute」無論如何,那些半頁的答案是冗長但含糊的,仍然不能解釋python類屬性的奇怪行爲。任何人都可以從Python手冊中剪切和粘貼。 – Mark 2011-12-20 08:03:11

相關問題