0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonにおけるクラス変数とインスタンス変数、およびDataclass

Last updated at Posted at 2023-08-02

概要

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の章を参照してください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?