Реалізація дескрипторів
Оновлено: 28.04.2023
Наступні методи застосовуються лише тоді, коли екземпляр класу, що містить метод (так званий клас descriptor), з’являється в класі owner (дескриптор має бути або в словнику класу власника, або в словнику класу для одного з його батьки). У наведених нижче прикладах «атрибут» відноситься до атрибута, ім’я якого є ключем властивості в класі власника __dict__.
object.__get__(self, instance, owner=None) Викликається, щоб отримати атрибут класу власника (доступ до атрибуту класу) або екземпляра цього класу (доступ до атрибуту екземпляра). Необов’язковий аргумент owner — це клас власника, тоді як instance — це екземпляр, через який був доступ до атрибута, або None, коли доступ до атрибута здійснюється через owner. Цей метод має повертати обчислене значення атрибута або викликати виняток AttributeError. PEP 252 вказує, що __get__() можна викликати за допомогою одного або двох аргументів. Власні вбудовані дескриптори Python підтримують цю специфікацію; проте ймовірно, що деякі інструменти сторонніх розробників мають дескриптори, які потребують обох аргументів. Власна реалізація __getattribute__() Python завжди передає обидва аргументи незалежно від того, потрібні вони чи ні.
object.__set__(self, instance, value) Викликається, щоб встановити атрибуту екземпляра екземпляру класу власника нове значення value. Зверніть увагу: додавання __set__() або __delete__() змінює тип дескриптора на «дескриптор даних». Перегляньте Виклик дескрипторів для отримання додаткової інформації.
object.__delete__(self, instance) Викликається для видалення атрибута екземпляра екземпляра класу власника.
Атрибут __objclass__ інтерпретується модулем inspect як визначення класу, де було визначено цей об’єкт (встановлення цього належним чином може допомогти під час інтроспекції динамічних атрибутів класу). Для callables це може вказувати на те, що екземпляр заданого типу (або підкласу) очікується або вимагається як перший позиційний аргумент (наприклад, CPython встановлює цей атрибут для незв’язаних методів, реалізованих у C).