【6日でできるPython入門】クラス③


Pythonのクラスには「インスタンス属性」と「クラス属性」という2種類の属性が存在します。
 これまで、インスタンスごとに異なる情報(例:self.nameself.age)を管理してきましたが、全インスタンスで共通の情報を1か所で管理したい場合は「クラス属性」を使います。
 ここでは、インスタンス属性とクラス属性の違い・使い分け・動作のルールについて、具体例をもとにしっかり理解します。

1.クラス属性とインスタンス属性

1.1. グローバル変数によるインスタンス共通データ

インスタンスの数を数えたい場合、グローバル変数を使う方法もあります。

ファイル名: lesson22-1.py

user_count = 0  # グローバル変数

class User:
    def __init__(self, username):
        global user_count
        self.username = username
        user_count += 1

alice = User("Alice")
bob = User("Bob")
print(f"現在のユーザー数: {user_count}")

実行結果

現在のユーザー数: 2

解説

  • グローバル変数を使うと、全インスタンス共通の値も管理できますが、管理が分散してしまいがちです。

1.2. クラス属性による共通データの管理

クラス属性は「クラス名.属性名」でアクセスし、全インスタンスで共有されます。

ファイル名: lesson22-2.py

class User:
    total_users = 0  # クラス属性

    def __init__(self, username):
        self.username = username  # インスタンス属性
        User.total_users += 1

alice = User("Alice")
bob = User("Bob")
print(f"登録ユーザー数: {User.total_users}")

実行結果

登録ユーザー数: 2

解説

  • クラス属性total_usersは、Userクラスのすべてのインスタンスで共通の値です。
  • 管理が一か所にまとまり、グローバル変数よりも明確です。

2.インスタンス属性とクラス属性の違い

2.1. インスタンス属性とクラス属性のアクセス

クラス属性は「インスタンス名.属性名」でもアクセスできますが、値の検索の順序がポイントです。

ファイル名: lesson22-3.py

class Product:
    category = "雑貨"  # クラス属性

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

item = Product("タオル")
print(f"商品カテゴリー: {item.category}")
print(f"クラスのカテゴリー: {Product.category}")

実行結果

商品カテゴリー: 雑貨
クラスのカテゴリー: 雑貨

解説

  • インスタンスからクラス属性にアクセスできますが、まずインスタンス属性に同じ名前がなければクラス属性が使われます

2.2. 属性名の競合と動作

同じ名前の属性がインスタンスとクラスの両方にある場合、インスタンス属性が優先されます。

ファイル名: lesson22-4.py

class Product:
    category = "文房具"  # クラス属性

    def __init__(self, name):
        self.name = name
        self.category = "日用品"  # インスタンス属性

item = Product("ノート")
print(f"インスタンスのカテゴリー: {item.category}")
print(f"クラスのカテゴリー: {Product.category}")

実行結果

インスタンスのカテゴリー: 日用品
クラスのカテゴリー: 文房具

解説

  • インスタンス属性categoryが優先され、クラス属性の値は隠れます。
  • クラスとインスタンスで同名属性を持つのは混乱の元なので注意しましょう。

3.クラス属性とインスタンス属性のまとめ

属性の種類定義場所アクセス方法共有範囲上書きの可否
クラス属性クラス直下クラス.属性、インスタンス.属性すべてのインスタンスで共通インスタンス属性で隠せる
インスタンス属性__init__内などインスタンス.属性そのインスタンスだけクラス属性を上書きできる

この章では、クラス属性とインスタンス属性の違い・仕組み・使い分けを整理しました。