Descriptor (дескриптор)
Атрибут объекта, доступ к которому подчиняется протоколу дескриптора.
Для реализации дескриптора классу требуется определить один или несколько методов, входящих в протокол дескриптора:
По умолчанию при получении значения, установке значения или удалении атрибута мы оперируем словарём объекта (и далее класса и его родителей). Иногда в ходе описанных операций может понадобиться дополнительная логика — для этого и существуют дескрипторы.
Существуют два вида дескрипторов:
Пример определения протокола дескриптора и привязки дескриптора к классу:
По умолчанию при получении значения, установке значения или удалении атрибута мы оперируем словарём объекта (и далее класса и его родителей). Иногда в ходе описанных операций может понадобиться дополнительная логика — для этого и существуют дескрипторы.
Существуют два вида дескрипторов:
Вид | Признак | Пример |
---|---|---|
дескрипторы не-данных | наличие только __get__() | staticmethod(), classmethod() |
дескрипторы данных | наличие __get__() и других методов протокола | property() |
Внимание
Обращения к дескрипторам обрабатывает метод __getattribute__(), и его перекрытие препятствует автоматическим вызовам дескрипторов.
Пример определения протокола дескриптора и привязки дескриптора к классу:
class MyDescriptor:
def __set__(self, instance, value):
...
def __get__(self, instance, owner):
...
def __delete__(self, instance):
...
def __set_name__(self, owner, name):
...
class MyClass:
field1 = MyDescriptor()
field2 = MyDescriptor()
Внимание
Если в __dict__ владельца имеется запись с ключём, совпадающим с именем атрибута, указывающего на дескриптор, то в случае дескрипторов не-данных при обращении к атрибуту вернётся значение из
__dict__
, а не из дескриптора. В случае дескрипторов данных наоборот — значение из дескриптора.
Синонимы поиска: Descriptor (дескриптор), descriptors, дескрипторы
В разделе «type (тип)»:
basestring
Callable (вызываемый)
Container (контейнер)
Context Manager (менеджер контекста)
Iterator (итератор)
Number (число)
object (объект)
type.__abstractmethods__
type.__base__
type.__bases__
type.__basicsize__
type.__dict__
type.__dictoffset__
type.__doc__
type.__flags__
type.__itemsize__
type.__module__
type.__mro__
type.mro
type.__name__
type.__sizeof__
unicode (юникод)
На заметку
В соответствующем разделе вы можете зарегистрировать сообщество по интересам, чтобы о нём узнали и другие посетители сайта — возможно, так вы отыщите новых единомышленников и друзей.. И не важно виртуальное оно, или вполне реальное, давно существующее, или только-только придуманное.