Python

【Python】第5章第8回:クラス変数とインスタンス変数の違い

本記事では、Pythonのオブジェクト指向プログラミングにおける「クラス変数」と「インスタンス変数」の違いについて解説します。これらを理解することで、より効率的なコード設計が可能になります。

0. 記事の概要

この記事を読むメリット

  • クラス変数とインスタンス変数の違いを理解:適切な場面で使い分けができるようになります。
  • コード設計力の向上:データのスコープを明確にし、効率的なクラス設計が可能です。
  • バグの防止:誤った変数の使用によるエラーを回避できます。

この記事で学べること

  • クラス変数とインスタンス変数の定義と役割
  • それぞれの変数がどのように振る舞うかの実例
  • 使い分けの具体的なポイント

1. クラス変数とは?

1.1 定義

クラス変数は、クラスそのものに属する変数であり、すべてのインスタンス間で共有されます。クラス変数は通常、クラスブロック内で直接定義されます。

1.2 クラス変数の特徴

  • クラス全体で共有されるデータを保持
  • クラス名を通じてアクセス可能
  • インスタンス間で値が共通

1.3 クラス変数の実例

# クラス変数の例
class Person:
    species = "Human"  # クラス変数

    def __init__(self, name):
        self.name = name  # インスタンス変数
動作解説
  1. speciesはクラス変数であり、すべてのPersonインスタンスで共有されます。
  2. self.nameはインスタンスごとに異なる値を持ちます。

2. インスタンス変数とは?

2.1 定義

インスタンス変数は、特定のインスタンスに属する変数であり、インスタンスごとに異なる値を持ちます。

2.2 インスタンス変数の特徴

  • インスタンスごとに独立したデータを保持
  • selfキーワードを通じて定義・アクセス
  • 特定のインスタンスに固有の情報を格納

2.3 インスタンス変数の実例

# インスタンス変数の例
class Person:
    def __init__(self, name, age):
        self.name = name  # インスタンス変数
        self.age = age    # インスタンス変数
動作解説
  1. self.nameself.ageはインスタンスごとに異なる値を持ちます。
  2. インスタンス生成時に初期化され、個別の情報を格納します。

3. クラス変数とインスタンス変数の違い

3.1 主な違い

クラス変数インスタンス変数
クラス全体で共有インスタンスごとに独立
クラス名またはインスタンスからアクセス可能インスタンスからのみアクセス可能
通常、クラス内で直接定義selfを使用して定義

4. 練習問題

以下の課題に挑戦してみましょう。

  1. 「Company」というクラスを作成し、従業員数をクラス変数として定義してください。
  2. 従業員の名前と役職をインスタンス変数として保持し、それぞれの従業員情報を出力してください。

5. 練習問題の解答と解説

問1の解答例

# Companyクラス
class Company:
    employee_count = 0  # クラス変数

問2の解答例

# インスタンス変数を使用した例
class Company:
    employee_count = 0

    def __init__(self, name, position):
        self.name = name
        self.position = position
        Company.employee_count += 1

    def display_employee(self):
        print(f"名前: {self.name}, 役職: {self.position}")

6. まとめ

クラス変数とインスタンス変数の違いを理解することで、Pythonのクラス設計がより効果的になります。これらを適切に使い分け、効率的なコードを書きましょう。