Когда и почему я могу назначить экземпляр класса дескриптора атрибуту класса в Python, а не использовать свойство?
Я знаю, что свойство является дескриптором, но существуют ли конкретные примеры использования класса дескриптора, что может быть более выгодным, pythonic или обеспечить преимущество над использованием @property
функции метода?
Ответы
Ответ 1
Улучшение инкапсуляции и повторного использования: класс дескриптора может иметь настраиваемые атрибуты, установленные при создании экземпляра. Иногда полезно хранить данные, ограниченные таким образом, вместо того, чтобы беспокоиться о том, что они будут установлены или перезаписаны владельцу дескриптора.
Ответ 2
Позвольте мне привести цитату из видеоролика EuroPython 2012 "Обнаружение дескрипторов" :
Как выбрать дескрипторы и свойства:
- Свойства работают лучше всего, когда они знают о классе
- Дескрипторы более общие, часто могут применяться к любому классу
- Использовать дескрипторы, если поведение отличается от классов и экземпляров.
- Свойства - это синтаксический сахар
Кроме того, обратите внимание, что вы можете использовать __slots__
с дескрипторами.
Ответ 3
@property не позволяет вам одновременно определять специализированные методы установки и получения.
Если метод getter "достаточно хорош", используйте @property, иначе вам понадобится свойство().