クラス属性 vs インスタンス属性

Pythonによるオブジェクト指向プログラミング入門

George Boorman

Curriculum Manager, DataCamp

OOP の中核原則

カプセル化:

  • データとメソッドの束ね

継承:

  • 既存コードの機能拡張

ポリモーフィズム:

  • 統一インターフェースの提供
Pythonによるオブジェクト指向プログラミング入門

インスタンス属性

class Employee:
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

emp1 = Employee("Teo Mille", 50000) 
emp2 = Employee("Marta Popov", 65000)
  • name と salary は各オブジェクト固有
  • self は値をオブジェクトに割り当てる
Pythonによるオブジェクト指向プログラミング入門

クラス属性

  • クラスの全インスタンスで共有されるデータ

 

  • class 本体で「クラス属性」を定義

 

  • クラス内の「グローバル変数」に相当
Pythonによるオブジェクト指向プログラミング入門

クラス属性の実装

class Employee:
    # クラス属性を定義
    # self. は不要
    MIN_SALARY = 30000 

def __init__(self, name, salary): self.name = name # クラス名で # クラス属性にアクセス if salary >= Employee.MIN_SALARY: self.salary = salary
else: self.salary = Employee.MIN_SALARY
  • MIN_SALARY は全インスタンスで共有
  • クラス属性の定義に self は使わない
  • 慣例として大文字を使用
  • 値の参照は ClassName.ATTR_NAME を使用
Pythonによるオブジェクト指向プログラミング入門

クラスレベルの属性

class Employee:
    # クラス属性を定義
    MIN_SALARY = 30000    

def __init__(self, name, salary): self.name = name # クラス名で # クラス属性にアクセス if salary >= Employee.MIN_SALARY: self.salary = salary else: self.salary = Employee.MIN_SALARY
emp1 = Employee("John", 40000)
print(emp1.MIN_SALARY)
30000
emp2 = Employee("Jane", 60000)
print(emp2.MIN_SALARY)
30000
Pythonによるオブジェクト指向プログラミング入門

クラス属性の変更

emp1 = Employee("John", 40000)
emp2 = Employee("Jane", 60000)

# emp1 の MIN_SALARY を更新 emp1.MIN_SALARY = 50000
# 両者の MIN_SALARY を出力 print(emp1.MIN_SALARY) print(emp2.MIN_SALARY)
50000
30000
Pythonによるオブジェクト指向プログラミング入門

クラス属性の変更

  • MIN_SALARY はクラス定義で作成

 

  • オブジェクト側の MIN_SALARY 更新はクラス定義の値に影響しない

 

  • セキュリティ: ソフトウェアの意図しない変更を防ぐ
Pythonによるオブジェクト指向プログラミング入門

クラス属性を使う理由

クラスに関連するグローバル定数

 

  • 属性の最小・最大値
    • 不正なデータを防止
  • よく使う値や定数(例: Database クラスの host、port)
    • オブジェクト作成時の重複を回避
Pythonによるオブジェクト指向プログラミング入門

Passons à la pratique !

Pythonによるオブジェクト指向プログラミング入門

Preparing Video For Download...