I made an example to try to convince you to take the second approach but I got confused...
>>> 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')
"What is going on?" I thought to myself. Then I realized that the behavior depends on object ids...
>>> 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
So, back to my original answer: do not take the first approach unless you don't care if your variable gets re-assigned, because what you will get is not what you expect. The first approach makes the variable belong to the class, the second makes the variable belong to the instance - but if someone reassigns the variable in the first situation, you are going to get some very strange results.
Corollary - if you have your class methods only refer to the class' variable (i.e. Foo.LABELS
) then you will obviously get what you expect, but if someone re-uses your code in a different manner then who knows what they'll get?
Corollary #2 - there is no way in python to enforce reference immutability. So you really should go with the second approach.