概要
Pythonのクラスでは、全てのインスタンスで共有される「クラス変数」、各インスタンスごとに独立に持つ「インスタンス変数」の2種類の変数があります。さらにPython 3.7からは@dataclass
デコレータが追加され、インスタンス変数を自動で設定する便利な機能が提供されています。
クラス変数
クラス変数はクラス定義内で直接作成され、そのクラスの全てのインスタンス間で共有されます。これは、クラス全体での状態を保持する必要がある場合や、全てのインスタンスで共通の値を持つ必要がある場合に便利です。
class MyClass:
instance_count = 0 # クラス変数: 全てのインスタンスで共有
def __init__(self):
MyClass.instance_count += 1
a = MyClass()
b = MyClass()
print(MyClass.instance_count) # 出力は 2
この例では、instance_count
クラス変数を使用して、MyClass
のインスタンスが作成された回数を追跡します。
インスタンス変数
一方、インスタンス変数は各インスタンスごとに独立しています。これらは通常、インスタンスの初期化時(__init__
メソッド内)に設定されます。インスタンス変数は、各インスタンスが独自の状態を持つ必要がある場合に使用されます。
class MyClass:
def __init__(self, name):
self.name = name # インスタンス変数: 各インスタンスごとに異なる値を持つ
a = MyClass("Alice")
b = MyClass("Bob")
print(a.name) # 出力は "Alice"
print(b.name) # 出力は "Bob"
この例では、各MyClass
インスタンスは独自のname
インスタンス変数を持ちます。
Dataclass
Python 3.7からは、@dataclass
デコレータが導入されました。このデコレータを使用すると、自動的に特殊メソッド(__init__
、__repr__
など)を生成し、クラスの作成を効率化することができます。@dataclass
は、インスタンス変数を自動的に設定します。
from dataclasses import dataclass
@dataclass
class MyClass:
name: str
a = MyClass("Alice")
b = MyClass("Bob")
print(a.name) # 出力は "Alice"
print(b.name) # 出力は "Bob"
この例では、name
はインスタンス変数として自動的に設定され、MyClass
は__init__
や__repr__
を自動的に生成します。
より詳細な情報はPythonの公式ドキュメントのクラスの章とdataclassesの章を参照してください。