クラス変数とインスタンス変数
pythonはオブジェクト指向言語で、プロパティにデータを格納することができる。
プロパティには、クラス変数とインスタンス変数がある。
ここでは、クラス変数とインスタンス変数の違いについて説明する。
クラス変数について
クラス変数は、クラスが所有する変数で作成されたすべてのインスタンス間で共有される。
コードを実行して、クラスが読み込まれたされた際にクラス変数が宣言される。
以下のように定義する
class Person:
name = 'Hoge' # クラス変数
また、アクセスする場合には以下のようにクラス名.変数名とすればよい。
Person.name
上の例では、Personクラスにnameをクラス変数として持たせている。
Example
- クラス変数へのアクセス、変更
name = "Espresso"
print(Coffee.name) # クラス変数にアクセス(Espressoと表示)
Coffee.name = "Americano" # クラス変数を変更
print(Coffee.name) # Americanoと表示
また、インスタンスを作成してから、
instance.variable
として、クラス変数にアクセスすることもできる。
ただしこの方法では、クラス変数を直接書き換えることはできない
instance.variable = "〇〇"
として値を書き換えた場合、クラス変数とは別のメモリ上の位置にデータが格納される
Example
- インスタンスからクラス変数へアクセス
name = "Espresso"
c1 = Coffee() # インスタンス作成
print(c1.name) # Espresso
c1.name = "Americano" # 値を変更(クラス変数Coffee.nameとは異なるメモリ上に格納される)
print(c1.name) # Americano
print(Coffee.name) # Espresso
また、
instance.__class__.変数名
としてもクラス変数にアクセスすることができる。
Example
- インスタンスからクラス変数へアクセス
name = "Espresso"
c1 = Coffee() # インスタンス作成
print(c1.__class__.name) # Espresso
c1.__class__.name = "Americano" # クラス変数の値を変更
print(c1.__class__.name) # Americano
print(Coffee.name) # Americano
インスタンス変数について
インスタンス変数は、クラスから作成されたインスタンスが持っている変数である。
属しているインスタンスに応じて、インスタンス変数の値は異なる。
また、インスタンス変数はメソッド内に記述して利用する。
class Order:
def __init__(self, name, price):
self.name = coffee_name
self.price = price
上の例では、nameとpriceがインスタンス変数である。
インスタンス変数は以下のように利用する
Example
- インスタンス変数へアクセス
class Human:
msg = "Hello" # クラス変数です。インスタンス間で共有される
def __init__(self, name, age):
self.name = name
self.age = age
# インスタンス変数、コンストラクタ呼び出しの時に初期化
def print_msg(self):
print("{} name = {}, age = {}".format(self.msg, self.name, self.age))
taro = Human("Taro", 20)
jiro = Human("Jiro", 18)
print(taro.msg) # クラス変数msgにアクセス、「Hello」と表示
print(jiro.msg) # クラス変数msgにアクセス、「Hello」と表示
print(taro.name) # インスタンス変数nameにアクセス、「Taro」と表示
print(jiro.name) # インスタンス変数nameにアクセス、「Jiro」と表示
print(Human.msg) # クラス変数は、クラス名.変数名でアクセス可能
Human.msg = "Hi" # クラス変数を変更
print(taro.msg) # クラス変数msgは共有されており、変更されたため「Hi」と表示
print(jiro.msg) # クラス変数msgは共有されており、変更されたため「Hi」と表示
taro.__class__.msg = "GoodBye" # クラス変数は、インスタンス名.__class__.変数名でアクセス可能
print(taro.msg) # クラス変数msgは共有されており、変更されたため「GoodBye」と表示
print(jiro.msg) # クラス変数msgは共有されており、変更されたため「GoodBye」と表示
クラス変数とインスタンス変数についてまとめ
以上
クラス変数は、クラスの直下に定義されすべてのインスタンスから参照すると同じ値を得ることができる。
このようにクラス変数はインスタンス間で共有される。
インスタンス変数は、インスタンス毎に設定してそれぞれ値を入れることができる。
クラス変数 |
|
---|---|
インスタンス変数 |
|