【Python】クラス変数とクラスメソッド

【Python】クラス変数とクラスメソッド

目次

クラス変数とは?

クラス変数は、クラスレベルで定義され、すべてのインスタンスで共有される変数です。 これはインスタンスごとに異なる値を持つ「インスタンス変数」とは異なり、クラス全体で同じ値を保持します。

インスタンス変数との違い

クラス変数とインスタンス変数の違いを見てみましょう。


class Sample:
    class_var = "私はクラス変数"

    def __init__(self, value):
        self.instance_var = value

obj1 = Sample("インスタンス変数1")
obj2 = Sample("インスタンス変数2")

print(obj1.class_var)  # 私はクラス変数
print(obj2.class_var)  # 私はクラス変数
print(obj1.instance_var)  # インスタンス変数1
print(obj2.instance_var)  # インスタンス変数2

ポイント: – クラス変数はすべてのインスタンスで共有される – インスタンス変数は各インスタンスごとに異なる値を持てる

クラス変数の具体例

クラス変数の使い方をより深く理解するために、いくつかの具体例を見てみましょう。

例1: インスタンスのカウント


class Counter:
    count = 0  # クラス変数

    def __init__(self):
        Counter.count += 1  # クラス変数を更新

print(Counter.count)  # 0
obj1 = Counter()
print(Counter.count)  # 1
obj2 = Counter()
print(Counter.count)  # 2

例2: 共通設定を持つクラス


class Config:
    default_language = "日本語"

print(Config.default_language)  # 日本語
Config.default_language = "English"
print(Config.default_language)  # English

クラスメソッドとは?

クラスメソッドは、クラス全体で動作するメソッドで、@classmethod デコレーターを使って定義されます。 第一引数にはクラス自身を表す cls を取ります。

静的メソッドとの違い

クラスメソッドと静的メソッドの違いを整理すると以下のようになります。

  • クラスメソッドは cls を引数に取り、クラス変数を操作できる
  • 静的メソッドは clsself も取らず、独立した関数のように振る舞う

クラスメソッドと静的メソッドの例


class Example:
    value = 10

    @classmethod
    def update_value(cls, new_value):
        cls.value = new_value

    @staticmethod
    def greet():
        return "こんにちは!"

Example.update_value(20)
print(Example.value)  # 20

print(Example.greet())  # こんにちは!

クラスメソッドの具体例

例1: クラスメソッドでクラス変数を更新


class Factory:
    production_count = 0

    @classmethod
    def produce(cls):
        cls.production_count += 1
        return f"生産数: {cls.production_count}"

print(Factory.produce())  # 生産数: 1
print(Factory.produce())  # 生産数: 2

例2: クラスメソッドを使った別名コンストラクタ


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

    @classmethod
    def from_string(cls, data):
        name, age = data.split(",")
        return cls(name, int(age))

p = Person.from_string("田中,30")
print(p.name)  # 田中
print(p.age)   # 30

まとめ

  • クラス変数はすべてのインスタンスで共有される変数
  • クラスメソッドはクラスを第一引数に取るメソッドで、クラス変数を操作できる
  • クラスメソッドは @classmethod デコレーターを使って定義する
  • 静的メソッド (@staticmethod) とは異なり、クラス変数にアクセス可能

コメントを残す

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