Доступ к атрибутам в Python: сначала слоты, затем dict?
в приведенном ниже примере атрибут x доступ из слотов объекта, даже если x присутствует __dict__ (это не типичный или, возможно, полезный случай, но мне любопытно):
>>> class C(object):
... __slots__ = 'x'
...
>>> class D(C):
... pass
...
>>> obj = D()
>>> obj.x = 'Stored in slots'
>>> obj.__dict__
{}
>>> obj.__dict__['x'] = 'stored in __dict__'
>>> obj.x
'Stored in slots'
является ли этот порядок доступа (сначала слоты) документированным поведением? или просто деталь реализации?
1 ответов
да __dict__ объекта консультируется только после того, как были проконсультированы дескрипторы данных. __slots__ атрибуты реализуются как дескрипторы данных.
посмотреть вызов дескрипторов:
например, привязки, приоритет вызова дескриптора зависит от того, какие методы дескриптора определены. Дескриптор может определить любую комбинацию
__get__(),__set__()и__delete__(). Если он не определяет__get__(), то доступ к атрибут возвращает сам объект дескриптора, если в словаре экземпляра объекта нет значения. Если дескриптор определяет__set__()и/или__delete__(), это дескриптор данных; если он не определяет ни один, это не дескриптор данных. Обычно дескрипторы данных определяют оба__get__()и__set__(), а не дескрипторов, есть только__get__()метод. Дескрипторы данных с__set__()и__get__()defined всегда переопределяет переопределение в словаре экземпляра. В отличие от этого, не-данные дескрипторы могут быть переопределены экземплярами.
и с той же страницы, слоты:
__slots__реализуются на уровне класса путем создания дескрипторов (реализующих дескрипторы) для каждого имени переменной. В результате атрибуты класса не могут использоваться для установки значений по умолчанию для переменных экземпляра, определенных__slots__; в противном случае атрибут class перезапишет назначение дескриптора.