С Python 3.4 существует дескриптор DynamicClassAttribute
. В документации указано:
types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)
Доступ атрибута маршрута в классе к
__getattr__
.Это дескриптор, используемый для определения атрибутов, которые действуют по-разному при доступе через экземпляр и через класс. Доступ к экземпляру остается нормальным, но доступ к атрибуту через класс будет перенаправлен на метод классов
__getattr__
; это делается путем повышенияAttributeError
.Это позволяет иметь активные свойства в экземпляре и иметь виртуальные атрибуты для класса с тем же именем (см. Enum для примера).
Новое в версии 3.4.
Он, по-видимому, используется в перечислении модуля:
# DynamicClassAttribute is used to provide access to the `name` and
# `value` properties of enum members while keeping some measure of
# protection from modification, while still allowing for an enumeration
# to have members named `name` and `value`. This works because enumeration
# members are not set directly on the enum class -- __getattr__ is
# used to look them up.
@DynamicClassAttribute
def name(self):
"""The name of the Enum member."""
return self._name_
@DynamicClassAttribute
def value(self):
"""The value of the Enum member."""
return self._value_
Я понимаю, что перечисления немного особенные, но я не понимаю, как это относится к DynamicClassAttribute
. Что означает, что эти атрибуты являются динамическими, как это отличается от обычного свойства, и как использовать DynamicClassAttribute
в моих интересах?