Я знаю, что свойство является дескриптором, но есть ли конкретные примеры, когда использование класса дескриптора может быть более выгодным, питоническим или давать некоторые преимущества по сравнению с использованием @property
в функции метода?
Когда и почему я могу назначить экземпляр класса дескриптора атрибуту класса в Python, а не использовать свойство?
comment
Почему свойство является дескриптором?
- person Tim   schedule 29.06.2017
Ответы (3)
Лучшая инкапсуляция и возможность повторного использования: класс дескриптора может иметь настраиваемые атрибуты, установленные при создании экземпляра. Иногда полезно держать данные ограниченными таким образом, вместо того, чтобы беспокоиться о том, что они будут установлены или перезаписаны владельцем дескриптора.
person
XORcist
schedule
30.04.2011
Спасибо! Таким образом, вы можете отделить обязанности дескриптора от класса, который создает экземпляр дескриптора?! Великолепно!
- person mkelley33; 30.04.2011
Возможности буквально безграничны ;) Подумайте о таких вещах, как отложенная загрузка: установите строку чего-то, что вы хотите загрузить позже, при первом доступе к дескриптору, и вам больше никогда не придется об этом беспокоиться. Или удалите беспорядок из класса владельца и поместите его туда, где он логически принадлежит.
- person XORcist; 30.04.2011
@möter установить строку того, что вы хотите загрузить позже Вы можете сделать то же самое, используя
@property
, не так ли?
- person Piotr Dobrogost; 12.10.2012
@PiotrDobrogost уверен, что сможешь. Но для этого потребуется как минимум еще одно заявление, верно?
- person XORcist; 12.10.2012
Можем ли мы применить дескриптор к методу экземпляра?
- person variable; 09.04.2020
Дескриптор может возвращать вызываемый объект, который затем может быть вызван, включая методы экземпляра. 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
Почему я предпочитаю собственность чему-то вроде
@my_method_name.setter
? Кроме того, как это применимо к концепции пользовательского класса дескриптора?
- person mkelley33; 30.04.2011