Pythonでは、クラス内で利用される変数には「クラス変数」と「インスタンス変数」の2種類があります。

クラス変数

クラス変数は、そのクラスのすべてのインスタンスによって共有される属性やメソッドのためのものです。クラス変数の値を変更した場合、その値の変更がインスタンス内で共有されます。

class Dog:
    kind = 'canine'  # class variable shared by all instances

d = Dog()
e = Dog()
print(d.kind)  # 'canine'
print(e.kind)  # 'canine'

インスタンス変数

一方、インスタンス変数はそれぞれのインスタンスについて固有のデータのためのもので、各インスタンスに固有の値を持ちます。インスタンス変数は、インスタンス内で閉じるので、インスタンス変数を変更しても他のインスタンスに影響を及ぼしません。

class Dog:
    def __init__(self, name):
        self.name = name  # instance variable unique to each instance

d = Dog('Fido')
e = Dog('Buddy')
print(d.name)  # 'Fido'
print(e.name)  # 'Buddy'

注意点

特にクラス変数で宣言してしまうと、全てのインスタンス(ここ大事)で変数が共有されているので、リストや辞書などの値を追加・保持する系のオブジェクトを使用する際には特に注意が必要です。予期しない動作を防ぐためにも、list型などmutableなオブジェクトはインスタンス変数で使用しましょう。

class Dog:
    tricks = []  # mistaken use of a class variable

    def __init__(self, name):
        self.name = name

    def add_trick(self, trick):
        self.tricks.append(trick)

d = Dog('Fido')
e = Dog('Buddy')
d.add_trick('roll over')
e.add_trick('play dead')
print(d.tricks)  # ['roll over', 'play dead']

上記の例では、クラス変数として宣言したlist型変数 tricks について、2つの異なるインスタンス deadd_trick された値が2つのインスタンス de で共有されていることわかります。すなわち、クラス変数は、インスタンスが異なっても変数を共有します。

以上、Pythonのクラス変数とインスタンス変数についての基本的な理解を深めることができました。これらの理解は、Pythonでのプログラミングにおいて非常に重要です。これからもPythonの学習を続けていきましょう!.

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です