Python

Python初学者向け:インスタンス変数とクラス変数

スポンサーリンク

 

この記事はこんな方におススメです
  • Pythonを始めたばかりで基本から学びたい方
  • Pythonの基本的な部分を速習してまずは全体像を把握しておきたい方

▶ クラスについて基本から解説した記事は以下から確認いただけます。

はじめに

前回に引き続きクラスについて扱います。今回はクラス内の変数について基本から解説をします。クラス内で定義する変数には、「インスタンス変数」と「クラス変数」があります。それぞれどのようなものか、どのように使い分けるか、クラス内でどのように定義するか、と順にみていきましょう。この記事を読み終えると、「インスタンス変数」と「クラス変数」の違いが判り使い分けることができるようになります。

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

「インスタンス変数」については前回の投稿でも扱ってますね。あらためて確認しておくと、「インスタンス変数」は個々のインスタンスに紐づく変数です。一方で「クラス変数」はクラスに紐づく変数で、すべてのインスタンスに共通した値をもつ変数です。一つずつ見ていきましょう。

インスタンス変数の作成

インスタンス変数はコンストラクタという__init__の中で、「self.インスタンス変数名」のように定義します。インスタンス変数へのアクセスは「インスタンス名.インスタンス変数名」とします。前回定義したクラスAnimalで確認してみましょう。

class Animal:
    def __init__(self,name,age,weight):
        self.name=name
        self.age=age
        self.weight=weight

3~5行目でインスタンス変数name, age, weightが定義されています。実際にインスタンスを作って試してみましょう。

rion=Animal('らいおん',42,62)
np.array(dir(rion))
インスタンス変数の作成

赤枠で囲った部分のようにage, name, weightが確認できました。

インスタンス変数へのアクセス

インスタンス変数へのアクセスは「インスタン名.インスタン変数名」です。やってみましょう。

print(rion.name)
print(rion.age)
print(rion.weight)

これらはインスタンスごとに持つ値です。別のインスタンスを作って試してみましょう。

cat=Animal('ねこ',8,12)
print(cat.name)
print(cat.age)
print(cat.weight)

インスタンスrionとインスタンスcatではname, age, weightで異なる値を持っているのがわかりますね。

クラス変数の作成

クラス変数はどのインスタンスからもアクセスできる共通の変数となります。クラスのトップレベルに書くことで定義します。先ほどのクラスAnimal内にクラス変数countを定義してみましょう。

class Animal:
    count=0
    
    def __init__(self,name,age,weight):
        self.name=name
        self.age=age
        self.weight=weight
        self.count=Animal.count
        Animal.count+=1

2行目の部分でcountというクラス変数を定義しています。また、__init__の中でname, age, weight, countというインスタンス変数を定義しています。確認してみましょう。

np.array(dir(Animal))
クラス変数の作成

クラス変数countが定義されていますね。次にクラス変数へのアクセスを見ていきましょう。

クラス変数へのアクセス

クラス変数へのアクセスは「クラス名.クラス変数名」とします。「インスタンス名.クラス変数名」によるアクセスもできますが、この方法ではクラス変数を書き換えることはできません。「インスタンス名.クラス変数名 = ……」として代入を行うと、クラス変数ではなくインスタンス内にクラス変数と同じ名前のインスタンス変数が定義されるので注意しましょう。クラス変数の書き換えは「クラス名.クラス変数名」でおこないましょう。

先ほどと同様にrion, catというインスタンを作って属性を確認しておきましょう。

# インスタンスの作成
rion=Animal('らいおん',42,62)
cat=Animal('ねこ',8,12)

# インスタンス変数count、クラス変数countの確認
print(f'インスタンス変数countの値はrionインスタンスでは{rion.count}')
print(f'インスタンス変数countの値はcatインスタンスでは{cat.count}')
print(f'クラス変数countの値は{Animal.count}')
インスタンス変数、クラス変数の確認

少しややこしいですが、クラス変数countを定義して、コンストラクタの中ではインスタンス変数countを定義しています。インスタンス変数countは__init__が呼び出された時点でのクラス変数countを初期値としてセットし、その後、クラス変数countを1つカウントアップするようにしています。

クラス変数の初期値は0なので、rionインスタンス生成時にrionインスタンス内のインスタンス変数countは0にセットされます。その後、クラス変数countはカウントアップされ1となります。

次にcatインスタンス生成時にcatインスタンス内のインスタンス変数countは1にセットされます。その後、クラス変数countはカウントアップされ2となります。

まとめ

インスタンス変数はインスタンスに紐づく変数でインスタンスに固有の値を持つ、クラス変数はクラスに紐づく変数で各インスタンスに共通の値を持ちます。

インスタンス変数は__init__内でself.変数名の形で定義し、アクセスは「インタンス名.インスタンス変数名」とします。

クラス変数はクラスのトップレベルで定義し、アクセスは「クラス名.クラス変数名」とします。
※「インスタンス名.クラス変数名」でもアクセスできるが、クラス変数の値を更新することはできません。

コメント

タイトルとURLをコピーしました