要清楚,類屬性可能與您預期的不同。
實施例:
class Example(object):
class_data={}
def __init__(self,val):
self.val=val
def __repr__(self):
return str(self.val)
>>> Example.class_data['one']=1 # assign value to the empty dict in class Example
>>> e1,e2=Example(1), Example(2) # INSTANCES-self.val different for each instance
>>> print e1,e2,e1.class_data,e2.class_data
1 2 {'one': 1} {'one': 1}
^^^^^ ^^^^^ # SAME class_data in two different instances
注意實施例的每個實例具有class_data的相同的可變副本。它不受保護,因爲靜態類變量可能在Java或C++中。
事實上,你可以更改,添加或刪除在任何時候將這些類屬性:
>>> Example.class_data='old dict is gone gone gone...'
>>> print e1,e2,e1.class_data,e2.class_data
1 2 old dict is gone gone gone... old dict is gone gone gone...
您可能會看到這樣的代碼:
class Example(object):
class_constants=('fee','fie','foe')
# ...
隨着虛假的安慰,這是像個常數(另一種語言),因爲這樣:
>>> e1=Example(1)
>>> e1.class_constants[4]='fum'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
但是,這是一個虛假的安慰因爲... E中的一段代碼總是可以做到這一點:
>>> Example.class_constants=('another','tuple','of','constants')
,一些有類屬性的問題在於他們沒有做什麼期望 - 因爲它是一個常數。它們不是常量。類屬性更改類的所有現有和將來實例的數據。有時有用,但可能會令人困惑。
真的,如果class屬性是可變的,那沒有關係。如您所見 - 您可以隨時更改屬性。
您應該訪問self.user_data或ClassA.user_data – jimifiki 2013-02-11 15:46:56
這與pythonic沒有關係。這是與'user_data'在類的所有實例之間共享的事實。這是一個班級屬性。而且大多數開發人員都希望它是一個實例屬性,導致奇怪的行爲(對他們而言)。 – 2013-02-11 15:48:10
固定..對不起是一個錯字 – Lee 2013-02-11 15:48:11