需要明确的是,类属性可能与您预期的不同。
例子:
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
请注意, Example 的每个实例都具有相同的 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
但这是一种虚假的安慰,因为一段代码总是可以做到这一点:
>>> Example.class_constants=('another','tuple','of','constants')
有些人对类属性的问题是他们没有做预期的事情——就好像它是一个常数一样。它们不是常数。类属性更改类的所有现有和未来实例的数据。有时有用,但可能令人困惑。
实际上,类属性是否可变并不重要。如您所见——您可以随时更改属性。