我知道什么是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
之后添加print语句时,得到以下结果:
('-- 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)没有
有人能解释一下为什么会这样,或者我遗漏了什么吗?你知道吗
它们是3个不同的属性对象;第3个只是重用分配给第一个的内存,因为第一个已经被收集。当你使用
或者
decorator返回一个新的属性对象,反映您定义的getter或setter,然后将其绑定到您正在定义的函数的名称。因为您要定义的函数名是
name
,所以它将替换旧的name
属性。你知道吗装饰器每次都重新创建属性对象,将新信息与现有属性相结合。(a)和(c)中的对象ID相同是巧合。你知道吗
相关问题 更多 >
编程相关推荐