我知道什么是property/descriptor
和decorator
。但是我很难说到这一点。
class Person(object):
@property
def name(self, func):
pass
print("-- before setting -- ", name)
@name.setter # <---- what `name` object should be here
def name(self, v):
self._fn, self._ln = v.split(" ")
print("-- before getting -- ", name)
@name.getter # <---- and here
def name(self):
return self._fn + " " + self._ln
print("-- all done -- ", name) # <---- and here
Descriptor
是类级别对象。因此@name.setter
和@name.getter
应该获得相同的name
描述符对象。当我在setter
和getter
之后添加打印语句时,我得到以下结果:
('-- before setting -- ', <property object at 0x7fc1b0218f70>) # (a)
('-- before getting -- ', <property object at 0x7fc1b0218fc8>) # (b)
('-- all done -- ', <property object at 0x7fc1b0218f70>) #(c)
(a)和(c)语句具有相同的property
对象,但(b)没有。
有人可以解释我为什么或者我错过了什么?
答案 0 :(得分:3)
他们是3个不同的属性对象;第三个是重用第一个分配的内存,因为第一个已被收集。当你使用
@name.getter
或
@name.setter
装饰器返回一个新的属性对象,该对象反映您定义的getter或setter,然后绑定到您定义的函数的名称。由于您定义的函数名称为name
,因此它将替换旧的name
属性。
答案 1 :(得分:1)
装饰器每次都会重新创建属性对象,将新信息与现有属性相结合。 (a)和(c)中的对象ID相同是巧合。