描述子

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):
        # 可做清理、軟刪除,或丟出例外
        raise AttributeError("Can't delete SSN")
Python 物件導向程式設計進階

描述子實作示範

shaw = Student("Daniel Shaw", "193-80-1821")
print(shaw.ssn)  # 存取 ssn 屬性
XXX-XX-1821
shaw.ssn = "821-11-9380"  # 更新 Shaw 的社會安全號碼
print(shaw.ssn)
XXX-XX-9380
del shaw.ssn  # 嘗試刪除 ssn 屬性
AttributeError: Can't delete SSN
Python 物件導向程式設計進階

一起來練習吧!

Python 物件導向程式設計進階

Preparing Video For Download...