I made an example to convince you to take a 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's happening?" I thought to myself. Then I realized that the behavior depends on the identifiers of the objects ...
>>> 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: don't take the first approach unless you care if your variable is reassigned because what you get is not what you expect. The first approach makes the variable a member of the class, the second makes the variable membership of the instance, but if someone reassigns the variable in the first situation, you will get some very strange results.
Consequence If you have class methods that Foo.LABELS only to the class variable (i.e. Foo.LABELS ), then you will obviously get what you expect, but if someone reuses your code differently, then who knows What do they get?
Corollary # 2 - in python there is no way to force the use of immutable links. So you really have to go with a second approach.