Предположим, что у меня есть класс следующим образом:Вопросы о деталях @property в Python
class MyClass(object):
def __init__(self, value=None):
self.attr = value
@property
def attr(self):
# This acts as a getter?
# Let's call the function "attr_1" as alias
return self.__attr
@attr.setter
def attr(self, value):
# This acts as a setter?
# Let's call the function "attr_2" as alias
self.__attr = value
inst = MyClass(1)
Я прочитал Documentation on Descriptor и посмотрел на реализацию property
класса.
Насколько я знаю, когда я печатаю inst.attr
, происходит следующее:
- Первый
attr
(чей псевдонимattr_1
) найден, иattr
теперь экземплярproperty
класса, который является Дескриптор данных.
Поэтому он будет переопределять словарь экземпляра, что означает, что вызываетсяtype(inst).__dict__['attr'].__get__(inst, type(inst))
. attr.__get__(inst, type(inst))
вызываетattr.fget(inst)
, гдеfget()
фактически являетсяattr(self)
(функция «raw»attr_1
).- И, наконец,
attr.fget(inst)
возвращаетinst.__attr
.
вот первый вопрос: класс
MyClass
не имеет атрибут__attr
, то, как интерпретироватьinst.__attr
в шаге 3?Аналогично, в эмулированном сеттере, как Python находит атрибут
inst.__attr
для назначенияvalue
?И тривиальный вопрос: с
property
является классом, почему бы и нетProperty
вместоproperty
?
Что такое 'fget'? – thefourtheye
'property' на самом деле считается типом, а не классом (это разные вещи) – RafaelC
@thefourtheye подпись' property' является 'свойством (fget, fset, fdel, doc)', где первые три аргумента являются функциями. Ссылка на документацию в вопросе показывает полную реализацию 'property'. – Zelong