我做了一个例子试图说服你采用第二种方法,但我很困惑......
>>> class Foo():
... LABELS = ('One','Two','Three')
...
>>> Foo.LABELS
('One', 'Two', 'Three')
>>> Foo.LABELS = (1,2,3)
>>> Foo.LABELS
(1, 2, 3)
>>> f = Foo()
>>> g = Foo()
>>> f.LABELS = ('a','b','c')
>>> g.LABELS
(1, 2, 3)
>>> Foo.LABELS
(1, 2, 3)
>>> f.LABELS
('a', 'b', 'c')
“发生了什么事?”我心想。然后我意识到行为取决于对象ID......
>>> id(Foo.LABELS)
4562309280
>>> id(g.LABELS)
4562309280
>>> id(f.LABELS)
4562068336
>>> ('a','b','c') is ('a','b','c')
False
>>> Foo.LABELS = (4,5,6)
>>> g.LABELS
(4, 5, 6)
>>> f.LABELS
('a', 'b', 'c')
>>> id(Foo.LABELS)
4562309200
>>> id(g.LABELS)
4562309200
>>> id(f.LABELS)
4562068336
所以,回到我原来的答案:除非你不在乎你的变量是否被重新分配,否则不要采用第一种方法,因为你得到的不是你所期望的。第一种方法使变量属于类,第二种方法使变量属于实例 - 但如果有人在第一种情况下重新分配变量,你会得到一些非常奇怪的结果。
推论 - 如果你的类方法只引用类的变量(即Foo.LABELS),那么你显然会得到你所期望的,但如果有人以不同的方式重用你的代码,那么谁知道他们是什么会得到吗?
推论 #2 - 在 python 中没有办法强制引用不变性。所以你真的应该采用第二种方法。