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

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


person mkelley33    schedule 30.04.2011    source источник
comment
Почему свойство является дескриптором?   -  person Tim    schedule 29.06.2017


Ответы (3)


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

person XORcist    schedule 30.04.2011
comment
Спасибо! Таким образом, вы можете отделить обязанности дескриптора от класса, который создает экземпляр дескриптора?! Великолепно! - person mkelley33; 30.04.2011
comment
Возможности буквально безграничны ;) Подумайте о таких вещах, как отложенная загрузка: установите строку чего-то, что вы хотите загрузить позже, при первом доступе к дескриптору, и вам больше никогда не придется об этом беспокоиться. Или удалите беспорядок из класса владельца и поместите его туда, где он логически принадлежит. - person XORcist; 30.04.2011
comment
@möter установить строку того, что вы хотите загрузить позже Вы можете сделать то же самое, используя @property, не так ли? - person Piotr Dobrogost; 12.10.2012
comment
@PiotrDobrogost уверен, что сможешь. Но для этого потребуется как минимум еще одно заявление, верно? - person XORcist; 12.10.2012
comment
Можем ли мы применить дескриптор к методу экземпляра? - person variable; 09.04.2020
comment
Дескриптор может возвращать вызываемый объект, который затем может быть вызван, включая методы экземпляра. docs.python.org/3/howto/descriptor.html#descriptor- протокол - person XORcist; 09.04.2020

Позвольте мне процитировать великолепное видео "Discovering Descriptors" с EuroPython 2012:

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

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

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

person gahcep    schedule 17.03.2013

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

person Andreas Jung    schedule 30.04.2011
comment
Почему я предпочитаю собственность чему-то вроде @my_method_name.setter? Кроме того, как это применимо к концепции пользовательского класса дескриптора? - person mkelley33; 30.04.2011