Вы, вероятно, правы, что это просто соглашение, чтобы сделать эти атрибуты доступными только для чтения, выбранными, чтобы сделать свойство "все или ничего".Кажется, было бы немного более «Pythonic», чтобы разрешить их назначать после факта, но не может найти обоснование в Замечаниях по выпуску Python 2.2 (когда были введены свойства).
В Objects / descrobject.c атрибуты-члены свойства определены только для чтения:
static PyMemberDef property_members[] = {
{"fget", T_OBJECT, offsetof(propertyobject, prop_get), READONLY},
{"fset", T_OBJECT, offsetof(propertyobject, prop_set), READONLY},
{"fdel", T_OBJECT, offsetof(propertyobject, prop_del), READONLY},
{"__doc__", T_OBJECT, offsetof(propertyobject, prop_doc), READONLY},
{0}
};
В стороне: если вы замените READONLY
на 0
и скомпилируете,это все, что нужно для назначения fget, fset, ..
:
class Test(object):
def __init__(self):
self.flag = True
prop = property(lambda self: self.flag)
obj = Test()
print obj.prop
Test.prop.fget = lambda self: not self.flag
print obj.prop
Вывод:
True
False