プロパティ

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

Alex Yarosh

Content Quality Analyst @ DataCamp

属性値の変更

class Employee:
  def set_name(self, name):
    self.name = name 
  def set_salary(self, salary):
    self.salary = salary 
  def give_raise(self, amount):
    self.salary = self.salary + amount

def __init__(self, name, salary): self.name, self.salary = name, salary
emp = Employee("Miriam Azari", 35000)
# ドット記法と = で属性を変更
emp.salary = emp.salary + 5000
Python によるオブジェクト指向プログラミング

属性値の変更

class Employee:
  def set_name(self, name):
    self.name = name 
  def set_salary(self, salary):
    self.salary = salary 
  def give_raise(self, amount):
    self.salary = self.salary + amount

def __init__(self, name, salary): self.name, self.salary = name, salary
emp = Employee("Miriam Azari", 35000)
# ドット記法と = で属性を変更
emp.salary = emp.salary + 5000

 

 

属性アクセスを制御しますか?

  • 値の妥当性をチェック
  • または属性を読み取り専用に
    • set_salary() を変えても emp.salary = -100 は防げない
Python によるオブジェクト指向プログラミング

制限付き・読み取り専用の属性

import pandas as pd
df = pd.DataFrame({"colA": [1,2], "colB":[3,4]})
df
  colA colB
0    1    3
1    2    4
df.columns = ["new_colA", "new_colB"]
df
  new_colA  new_colB
0    1    3
1    2    4
# エラーになります
df.columns = ["new_colA", "new_colB", "extra"]
df
ValueError: Length mismatch: 
Expected axis has 2 elements, 
new values have 3 elements
df.shape = (43, 27)
df
AttributeError: can't set attribute
Python によるオブジェクト指向プログラミング

@property

class Employer:
  def __init__(self, name, new_salary):
     self._salary = new_salary


@property def salary(self): return self._salary
@salary.setter def salary(self, new_salary):
if new_salary < 0: raise ValueError("Invalid salary") self._salary = new_salary

 

← データ保存には先頭が _ の「保護」属性を使用

← 制限する属性名と同名のメソッド@property を付け、内部属性を返す

obj.attr = value 時に呼ばれるメソッド attr()@attr.setter を付ける

  • 代入する値は引数で受け取る
Python によるオブジェクト指向プログラミング

@property

class Employer:
  def __init__(self, name, new_salary):
     self._salary = new_salary


@property def salary(self): return self._salary
@salary.setter def salary(self, new_salary): if new_salary < 0: raise ValueError("Invalid salary") self._salary = new_salary
emp = Employee("Miriam Azari", 35000)
# "property" へのアクセス
emp.salary
35000
emp.salary = 60000 # <-- @salary.setter
emp.salary = -1000
ValueError: Invalid salary
Python によるオブジェクト指向プログラミング

なぜ@property?

  $$\text{\Large{ユーザー側: 属性のように扱える}}$$

 

$$\text{\Large{開発者側: アクセスを制御できる}}$$

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

その他の可能性

@attr.setter を追加しない

読み取り専用プロパティを作成

@attr.getter を追加

プロパティの値を取得する際に呼ばれるメソッドに使います

@attr.deleter を追加

del でプロパティを削除するときに呼ばれるメソッドに使います

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

Let's practice!

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

Preparing Video For Download...