Menu
Coddy logo textTech

インスタンス変数とクラス変数

CoddyのPythonジャーニー「Object Oriented Programming」セクションの一部 — レッスン 13/64。

インスタンス変数は各オブジェクトに固有ですが、クラス変数は同じクラスのすべてのオブジェクトで共有されます。

両方のタイプの変数を持つクラスの例を次に示します。

class Student:
    # クラス変数 - すべてのインスタンスで共有されます
    school = "Python High School"
    
    def __init__(self, name, grade):
        # インスタンス変数 - 各学生に固有です
        self.name = name
        self.grade = grade

学生オブジェクトを作成します:

alice = Student("Alice", "A")
bob = Student("Bob", "B")

インスタンス変数(各オブジェクトに固有)にアクセスします:

print(alice.name)  # Alice
print(bob.name)    # Bob
print(alice.grade) # A
print(bob.grade)   # B

クラス変数(すべてのオブジェクトで共有される)にアクセスします:

print(alice.school)     # Python High School
print(bob.school)       # Python High School
print(Student.school)   # Python High School

次に、クラス変数を変更します:

Student.school = "Python Academy"

変更がすべてのインスタンスにどのように影響するか確認してください:

print(alice.school)   # Python Academy
print(bob.school)     # Python Academy

出力:

Alice
Bob
A
B
Python High School
Python High School
Python High School
Python Academy
Python Academy

オブジェクトの作成後にインスタンス変数を作成することもできます。

alice.age = 16  # これはインスタンス変数を作成します
print(alice.age)  # 16
# print(bob.age)  # これはエラーを引き起こします - bobはageを持っていません

主な違い: インスタンス変数 (self.variable_name で作成される) は各オブジェクトに対して一意ですが、クラス変数 (クラス内で直接定義される) はすべてのオブジェクトで共有されます。クラス変数を変更すると、すべてのインスタンスに影響します。

challenge icon

チャレンジ

簡単

銀行システムを完成させましょう。1つのファイルで BankAccount クラスを定義し、別のファイルでそれを使用します。

以下のファイルを操作します:

  • bank_account.py: 属性とメソッドを持つ BankAccount クラスを定義します
  • driver.py: クラスをインポートし、アカウントを作成し、クラス変数の動作を確認します

両方のファイルにある TODO コメントに従って、ステップバイステップで進めてください。コメントの指示に従って、適切な変数やメソッドを持つクラスを作成し、クラス変数がすべてのインスタンスにどのように影響するかを確認します。

チートシート

インスタンス変数は各オブジェクトに固有のものですが、クラス変数は同じクラスのすべてのオブジェクトで共有されます。

両方の変数タイプを持つクラス:

class Student:
    # Class variable - shared by all instances
    school = "Python High School"
    
    def __init__(self, name, grade):
        # Instance variables - unique to each student
        self.name = name
        self.grade = grade

インスタンス変数へのアクセス(各オブジェクトに固有):

alice = Student("Alice", "A")
bob = Student("Bob", "B")
print(alice.name)  # Alice
print(bob.name)    # Bob

クラス変数へのアクセス(すべてのオブジェクトで共有):

print(alice.school)     # Python High School
print(bob.school)       # Python High School
print(Student.school)   # Python High School

クラス変数を変更すると、すべてのインスタンスに影響します:

Student.school = "Python Academy"
print(alice.school)   # Python Academy
print(bob.school)     # Python Academy

オブジェクト作成後にインスタンス変数を作成する:

alice.age = 16  # This creates an instance variable
print(alice.age)  # 16

自分で試してみよう

# TODO: bank_account.pyからBankAccountクラスをインポートする
from bank_account import BankAccount

# TODO: 以下の詳細で2つのアカウントを作成する:
# - account1: 名義人 "Alice Smith"、残高 $1000
# - account2: 名義人 "Bob Jones"、残高 $2000

# TODO: 両方のアカウントに対してdisplay_info()を呼び出す

# TODO: クラス変数interest_rateを0.03 (3%)に変更する
# 次の形式を使用する: BankAccount.interest_rate = 0.03

# TODO: "After interest rate change:" というテキストを出力する

# TODO: 両方のアカウントに対して再度display_info()を呼び出し、両方に新しい利率が適用されていることを確認する
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Object Oriented Programmingのすべてのレッスン