Когда и почему я могу назначить экземпляр класса дескриптора атрибуту класса в Python, а не использовать свойство?

Я знаю, что свойство является дескриптором, но существуют ли конкретные примеры использования класса дескриптора, что может быть более выгодным, pythonic или обеспечить преимущество над использованием @property функции метода?

Ответы

Ответ 1

Улучшение инкапсуляции и повторного использования: класс дескриптора может иметь настраиваемые атрибуты, установленные при создании экземпляра. Иногда полезно хранить данные, ограниченные таким образом, вместо того, чтобы беспокоиться о том, что они будут установлены или перезаписаны владельцу дескриптора.

Ответ 2

Позвольте мне привести цитату из видеоролика EuroPython 2012 "Обнаружение дескрипторов" :

Как выбрать дескрипторы и свойства:

  • Свойства работают лучше всего, когда они знают о классе
  • Дескрипторы более общие, часто могут применяться к любому классу
  • Использовать дескрипторы, если поведение отличается от классов и экземпляров.
  • Свойства - это синтаксический сахар

Кроме того, обратите внимание, что вы можете использовать __slots__ с дескрипторами.

Ответ 3

@property не позволяет вам одновременно определять специализированные методы установки и получения. Если метод getter "достаточно хорош", используйте @property, иначе вам понадобится свойство().