クラス変数の利用
クラスは独立したローカルスコープをもち、クラス定義が行わることにより名前空間を生成する。これに属する変数のことをクラス変数といい、クラスに対して一意な情報を保持するために用いられる。インスタンス変数やローカル変数との違いをしっかり理解してください。
ここまでに登場した名前空間は下図のようになる。
https://scrapbox.io/files/652a4e144d78d2001bcef8c8.png
クラス変数を作る
スコープ内からのアクセス:
class クラス:
【クラス変数名】
def メソッド:
....メソッドの定義....
「クラス定義の内側」の「メソッド定義の外側」の領域はクラスが管理するローカルスコープである。ここで作られた変数はクラス変数となり、クラスが生成する名前空間に所属する。 code:class_value1.py
class Myclass:
data = 'クラス変数'
print(Myclass.data)
クラス定義が行われた結果、Myclassクラスが管理するローカルスコープを範囲とする名前空間が作られ、その中にクラス変数dataが登録される。
クラス変数は「インスタンス化」することなく利用できることに注意しよう。
他のスコープからクラス変数を利用するには次のようにする。
【クラス名】.【クラス変数名】
グローバルスコープからの利用。
code:class_value2.py
class Myclass:
data = 'クラス変数'
print(Myclass.data)
Myclass.data = '外から代入したクラス変数'
print(Myclass.data)
インスタンスとクラスはスコープが異なるため、たとえそのクラスから生成されたメソッドであってもクラス変数を直接見ることはできない。
code:class_value31.py
class Myclass:
data = 'クラス変数'
def show(self):
print(data)
m1 = Myclass()
m1.show()
m1インスタンスのshowメソッドが管理する名前空間にdataという変数は存在しないので、NameError:を吐いて止まる。
https://scrapbox.io/files/652a5396305937001dfb808e.png
インスタンス化したメソッドからクラス変数を利用するには、クラス名を用いてスコープを特定する必要がある。
code:class_value32.py
class Myclass:
data = 'クラス変数'
def show(self):
print(Myclass.data)
m1 = Myclass()
m1.show()
クラス変数はクラスに対して一意に存在する。2つのインスタンスが1つのクラス変数を共有していることを確認しよう。
code:class_value4.py
class Myclass:
def set(self, data):
Myclass.data = data
m1 = Myclass()
m1.set('1番目のデータ')
print(Myclass.data)
m2 = Myclass()
m2.set('2番目のデータ')
print(Myclass.data)
https://scrapbox.io/files/652a554d455492001c384377.png
/icons/hr.icon
※ ブラウザのバックボタンで戻る