Python属性实例行为

时间:2014-01-03 08:57:47

标签: python python-2.7 descriptor python-internals

我知道什么是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@name.getter应该获得相同的name描述符对象。当我在settergetter之后添加打印语句时,我得到以下结果:

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

有人可以解释我为什么或者我错过了什么?

2 个答案:

答案 0 :(得分:3)

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

@name.getter

@name.setter

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

答案 1 :(得分:1)

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

相关问题