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つの異なるインスタンス d
と e
に add_trick
された値が2つのインスタンス d
と e
で共有されていることわかります。すなわち、クラス変数は、インスタンスが異なっても変数を共有します。
以上、Pythonのクラス変数とインスタンス変数についての基本的な理解を深めることができました。これらの理解は、Pythonでのプログラミングにおいて非常に重要です。これからもPythonの学習を続けていきましょう!.