Середній рівень об'єктно-орієнтованого програмування в 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:]
ssnself._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$$
$$
$$
Пам'ятайте: працюйте з 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