• Skip to main content
  • Skip to secondary menu
  • Skip to primary sidebar
  • Skip to footer

Tech Life

エンジニアの生き方を考えるメディア

  • プログラミング
    • Python入門
    • Flask入門
    • Django入門
  • 利用規約
  • プロフィール
You are here: Home / IT・プログラミング / Python / Pythonのクラス変数とインスタンス変数の使い分けについて

Pythonのクラス変数とインスタンス変数の使い分けについて

2019年1月8日 by 9nmatsumoto

Contents
  1. クラス変数とインスタンス変数
  2. クラス変数について
  3. インスタンス変数について
  4. クラス変数とインスタンス変数についてまとめ

クラス変数とインスタンス変数

pythonはオブジェクト指向言語で、プロパティにデータを格納することができる。
プロパティには、クラス変数とインスタンス変数がある。

ここでは、クラス変数とインスタンス変数の違いについて説明する。

クラス変数について

クラス変数は、クラスが所有する変数で作成されたすべてのインスタンス間で共有される。
コードを実行して、クラスが読み込まれたされた際にクラス変数が宣言される。
以下のように定義する


class Person:
name = 'Hoge' # クラス変数

また、アクセスする場合には以下のようにクラス名.変数名とすればよい。

Person.name

上の例では、Personクラスにnameをクラス変数として持たせている。

Example

  • クラス変数へのアクセス、変更
class Coffee:
    name = "Espresso"

print(Coffee.name) # クラス変数にアクセス(Espressoと表示)
Coffee.name = "Americano" # クラス変数を変更
print(Coffee.name) # Americanoと表示

また、インスタンスを作成してから、

instance.variable

として、クラス変数にアクセスすることもできる。

ただしこの方法では、クラス変数を直接書き換えることはできない

instance.variable = "〇〇"

として値を書き換えた場合、クラス変数とは別のメモリ上の位置にデータが格納される

Example

  • インスタンスからクラス変数へアクセス
class Coffee:
   name = "Espresso"

c1 = Coffee() # インスタンス作成
print(c1.name) # Espresso
c1.name = "Americano" # 値を変更(クラス変数Coffee.nameとは異なるメモリ上に格納される)
print(c1.name) # Americano
print(Coffee.name) # Espresso

また、

instance.__class__.変数名

としてもクラス変数にアクセスすることができる。

Example

  • インスタンスからクラス変数へアクセス
class Coffee:
    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」と表示

クラス変数とインスタンス変数についてまとめ

以上
クラス変数は、クラスの直下に定義されすべてのインスタンスから参照すると同じ値を得ることができる。
このようにクラス変数はインスタンス間で共有される。
インスタンス変数は、インスタンス毎に設定してそれぞれ値を入れることができる。

クラス変数
  • オブジェクト同士で共有する変数
  • メソッドの内部でなく、クラスの直下に記載
インスタンス変数
  • インスタンスごとに別々に利用する変数
  • メソッドの内部に記載

Filed Under: IT・プログラミング, Python Tagged With: python, インスタンス変数, クラス変数

Primary Sidebar

注目記事

ITエンジニアとしてスキルを高めるためのUdemy講座一覧(格安クーポン付き)

イメージ画像

スポンサーリンク

Footer

格安学習講座

ITエンジニアとしてスキルを高めるためのUdemy講座一覧(格安クーポン付き)

20時間以上のコースが2000円以内で購入して、一つの分野をマスターできます!!