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._ssn を操作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 を操作してください!
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")
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 中級オブジェクト指向プログラミング