2 番目のアプローチを取るように説得するために例を作成しましたが、混乱しました...
>>> 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
したがって、私の元の答えに戻ります。変数が再割り当てされても気にしない限り、最初のアプローチをとらないでください。最初のアプローチは変数をクラスに所属させ、2 番目のアプローチは変数をインスタンスに所属させます。しかし、誰かが最初の状況で変数を再割り当てすると、非常に奇妙な結果が得られます。
当然の結果 - クラスメソッドがクラスの変数 (つまりFoo.LABELS
) のみを参照する場合、明らかに期待どおりの結果が得られますが、誰かがあなたのコードを別の方法で再利用した場合、誰が何を得るかわかりません。
当然の結果 #2 - Python には、参照の不変性を強制する方法はありません。したがって、実際には2番目のアプローチを使用する必要があります。