このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】クラス属性を使ってクラスに値を保存する

クラス属性を使ってクラスに値を保存する

 オブジェクト指向プログラミングでは、各インスタンスが個別の情報(データ属性)を持つ一方で、クラス自体に共通の情報を保存する仕組みとしてクラス属性が用いられます。クラス属性は、クラスオブジェクトに直接値を保持するため、すべてのインスタンス間で共有され、例えば生成されたオブジェクトの個数を管理するなど、全体に関わる情報を扱うのに適しています。
 ここでは、クラス属性とデータ属性の違い、クラス属性の定義方法および操作方法について、表や具体的なプログラム例を交えて解説します。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.クラス属性の基本概念

1.1. データ属性とクラス属性の違い

Pythonのクラスには、値を保持するための属性(アトリビュート)として大きく2種類あります。

  • データ属性 (インスタンス属性)
    各オブジェクト(インスタンス)ごとに固有の値を保存します。オブジェクトによって値は異なっていて構いません。
  • クラス属性
    クラスに直接値を保存します。そのため、同じクラスから生成されるすべてのオブジェクトで共通の情報として扱うことができます。

クラス属性とデータ属性は以下のような特徴の違いがあります。

属性の種類保存先各インスタンスでの値操作方法
クラス属性クラス(クラスオブジェクト)すべてのインスタンスで共通クラス名.属性名 または インスタンス.属性名
データ属性各インスタンスインスタンスごとに異なる。インスタンス.属性名

 この表からもわかるように、クラス属性はそのクラスに属するすべてのオブジェクトで共有されるため、全体に関する情報の管理に適しています。

下表はクラスやオブジェクトがどのように属性やメソッドを持つのかを示しています。

要素主な要素
クラス- クラス属性
- データ属性
- メソッド
オブジェクト1- データ属性
- メソッド
オブジェクト2- データ属性
- メソッド
オブジェクト3- データ属性
- メソッド
  • クラス属性の特徴
    ・クラスに定義する属性のため、すべてのオブジェクトで同じ値を参照・更新できる。
    ・オブジェクトを生成しなくても(クラスを通じて)直接アクセスできる。
  • データ属性(インスタンス属性)の特徴
    ・各オブジェクトがもつ固有の値。
    ・オブジェクトごとに値が異なる。

1.2. クラス属性の定義方法

 クラス属性は、クラス定義の内部でメソッドの外側に直接代入することで作成します。たとえば、以下のように記述します。

class クラス名:
    クラス属性名 = 値

 このように定義された属性は、オブジェクト生成前から存在し、クラス名を使って直接操作することも可能です。

2.クラス属性を使った実践例:Product クラス

2.1. Product クラスの定義とクラス属性の利用

 ここでは、商品の情報を管理するための Product クラスを例に、クラス属性を使って生成されたオブジェクトの個数をカウントする方法を紹介します。各オブジェクトは、個別の名前と価格(データ属性)を持ちますが、生成された個数はクラス属性として管理されます。

class Product:
    # クラス属性:全インスタンスで共有する変数(生成された商品の個数をカウント)
    count = 0

    def __init__(self, name, price):
        # インスタンスごとのデータ属性
        self.name = name
        self.price = price
        # オブジェクト生成時にクラス属性 count をインクリメント
        Product.count += 1

    def display(self):
        # クラス属性とデータ属性を表示するメソッド
        print(Product.count, self.name, self.price)

【詳しい解説】

  • クラス属性の定義
    count = 0 とクラス定義内で書くことで、Product クラスの全てのインスタンスで共通のカウンターが作成されます。
  • init メソッド
    ・オブジェクト生成時に、各インスタンスの nameprice を初期化し、さらに Product.count += 1 により生成されたオブジェクトの数を更新しています。
  • display メソッド
    ・このメソッドでは、Product.count(クラス属性)と、self.nameself.price(データ属性)を出力しており、各オブジェクトごとに異なる情報とクラス全体の情報を同時に確認できます。

2.2. クラス属性の操作と出力例

次に、Product クラスから2つのオブジェクトを生成し、それぞれの内容を表示する例です。

# 1つ目のオブジェクトを生成:商品名 "Laptop"、価格 1200
p1 = Product('Laptop', 1200)
p1.display()  # 出力例: 1 Laptop 1200

# 2つ目のオブジェクトを生成:商品名 "Smartphone"、価格 800
p2 = Product('Smartphone', 800)
p2.display()  # 出力例: 2 Smartphone 800

実行結果

1 Laptop 1200
2 Smartphone 800

【詳しい解説】

  • オブジェクト生成
    p1 = Product('Laptop', 1200) によって、最初の Product オブジェクトが生成され、init 内で Product.count が 1 に更新されます。
    ・次に、p2 = Product('Smartphone', 800) で2つ目のオブジェクトが生成され、Product.count が 2 になります。
  • 表示
    p1.display() では、「1 Laptop 1200」が出力され、p2.display() では、「2 Smartphone 800」が出力されます。これにより、クラス属性である count がオブジェクト生成のたびに正しく更新され、全体の情報として共有されていることが確認できます。

まとめ

ここでは、クラス属性を使ってクラス全体に関する情報を管理する方法について解説しました。

  • クラス属性は、クラス定義内でメソッドの外側に宣言し、すべてのインスタンスで共有される。
  • インスタンスごとに異なるデータ属性とは異なり、クラス属性は共通の値を保持するため、オブジェクト全体に関する情報(例:生成個数など)の管理に役立つ。
  • クラス属性は、クラス名を使って直接操作できるほか、インスタンスからもアクセス可能である。

 これらの概念を理解することで、クラス設計における情報の一元管理や、オブジェクト間の整合性を保ったプログラムの作成が可能となります。