Python のクラス変数はインスタンスとクラスからアクセスできる
2023.02.18
Python のクラス変数は __init__(self):
の外に書きます。
class User:
age = 25
def __init__(self):
self.name = ''
a = User()
print(a.name) #
print(a.age) # 25
a.name = 'cat'
print(a.name) # cat
print(a.age) # 25
age
: クラス変数
name
: インスタンス変数
インスタンス a
はクラス変数にもインスタンス変数にもアクセスできます。
クラスからクラス変数にアクセスする
class User:
age = 25
def __init__(self):
self.name = ''
a = User()
b = User()
print(a.age) # 25
print(b.age) # 25
x = User.age
print(x) # 25
User.age
とクラスからクラス変数にアクセスできます。
クラス変数について思うこと
ほとんどの場面でクラス変数は使わない
Python はファイルとクラスの境界があいまいで、ファイルの直下にある変数とクラスのクラス変数はどちらもドットでアクセスします。
私なら、変数はクラスでなくファイルで定義します。クラス変数を使うのは
一つのファイルに複数のクラスがあり、それらが変数を共有できない
とき。Python と Java は違いますが、一つのファイルに複数の(異なるアクセスを想定された)クラスがあるプロジェクトは基本的に混沌としています。
クラス変数とクラスメソッドをじっと考えると、古いプログラミング言語を好む上級者の「クラスそのものへの不満」がわかってきます。そもそも Python はすべてをドットでアクセスする言語です。
私の結論
クラス変数やクラスメソッドを使うとき、たいていソースコードは崩壊している。クラス変数を見たら、クラス、ファイル、ディレクトリの設計に大きな欠陥があると考えていい。
クラス変数とクラスメソッドは中級者が好む。