Дескриптори

Середній рівень об'єктно-орієнтованого програмування в 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

  • Метод «setter» для ssn
  • Перевіряйте якість даних
  • Виконуйте операції з іншими атрибутами

$$

$$

$$

Пам'ятайте: працюйте з 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...