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
描述子是用來規範屬性讀取、設定或刪除方式的物件。
用 @property 建立描述子
也可用以下方式建立描述子…
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")
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.ssnclass 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!
class Student:
def __init__(self, name, ssn):
self.name = name
self.ssn = ssn
...
@ssn.deleter
def ssn(self):
# 可做清理、軟刪除,或丟出例外
raise AttributeError("Can't delete SSN")
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 物件導向程式設計進階