2

我知道什么是property/descriptordecorator。但我很难理解这一点。

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的描述符对象。当我在 and 之后添加打印语句时,我得到以下结果:@name.getternamesettergetter

('-- 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) 没有。

有人可以解释一下为什么会这样还是我错过了什么?

4

2 回答 2

3

它们是 3 个不同的属性对象;第三个只是重用为第一个分配的内存,因为第一个已被收集。当你使用

@name.getter

或者

@name.setter

装饰器返回一个新的属性对象,反映您定义的 getter 或 setter,然后将其绑定到您正在定义的函数的名称。由于您定义的函数的名称是name,它替换了旧name属性。

于 2014-01-03T09:06:08.693 回答
1

装饰器每次都重新创建属性对象,将新信息与现有属性结合起来。(a) 和 (c) 中的对象 ID 相同是巧合。

于 2014-01-03T09:04:23.553 回答