デスクリプタ

Python 中級オブジェクト指向プログラミング

Jake Roach

Data Engineer

属性とのやり取りを変える

class Student:
    def __init__(self, name, ssn):
        self.name = name
        self.ssn = ssn
# 学生オブジェクトを作成し、"ssn" 属性にアクセス
shaw = Student("Daniel Shaw", "193-80-1821")
print(shaw.ssn)

# 値が変更や削除されたら? どう扱うべきか?
193-80-1821
Python 中級オブジェクト指向プログラミング

@property でデスクリプタを作る

デスクリプタは、属性の取得・設定・削除の方法を制御するオブジェクトです。

@propertyでデスクリプタを作成

  • 「getter」「setter」「deleter」
  • メソッド名は属性名と同じ

ほかの作り方

  • property() 関数
  • __get__(), __set__(), __delete__()

$$

class Student:
    def __init__(self, name, ssn):
        self.name = name
        self.ssn = ssn

    @property  
    def ssn(self):
        return "XXX-XX-" + self._ssn[-4:]

    @ssn.setter  
    def ssn(self, new_ssn):
        self._ssn = new_ssn 

    @ssn.deleter
    def ssn(self):
        raise AttributeError("Can't delete SSN")
Python 中級オブジェクト指向プログラミング

@property

class Student:
    def __init__(self, name, ssn):
        self.name = name
        self.ssn = ssn  # 先頭にアンダースコアは不要

    @property  
    def ssn(self):  # これは「getter」
        return "XXX-XX-" + self._ssn[-4:]
  • ssn の取得方法を制御
  • self.ssn ではなく self._ssn を操作
Python 中級オブジェクト指向プログラミング

@ssn.setter

class Student:
    def __init__(self, name, ssn):
        self.name = name
        self.ssn = ssn
    ...

    @ssn.setter  
    def ssn(self, new_ssn):
        if len(new_ssn) == 11:
          # データ検証や
          # 他の属性への処理などを追加
          self._ssn = new_ssn

@<attribute-name>.setter

  • ssn の「setter」
  • データ品質を検証
  • 他の属性への処理を実行

$$

$$

$$

必ず self.ssn ではなく self._ssn を操作してください!

Python 中級オブジェクト指向プログラミング

@ssn.deleter

class Student:
    def __init__(self, name, ssn):
        self.name = name
        self.ssn = ssn

    ...

    @ssn.deleter
    def ssn(self):
        # Can perform clean up, soft delete, raise exception
        raise AttributeError("Can't delete SSN")
Python 中級オブジェクト指向プログラミング

デスクリプタの実行例

shaw = Student("Daniel Shaw", "193-80-1821")
print(shaw.ssn)  # Access the ssn attribute
XXX-XX-1821
shaw.ssn = "821-11-9380"  # Update Shaw's social security number
print(shaw.ssn)
XXX-XX-9380
del shaw.ssn  # Attempt to delete the ssn attribute
AttributeError: Can't delete SSN
Python 中級オブジェクト指向プログラミング

Ayo berlatih!

Python 中級オブジェクト指向プログラミング

Preparing Video For Download...