Python属性实例行为

2024-04-19 23:24:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道什么是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之后添加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)没有

有人能解释一下为什么会这样,或者我遗漏了什么吗?你知道吗


Tags: 对象nameselfhereobjectdefpropertysetting
2条回答

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

@name.getter

或者

@name.setter

decorator返回一个新的属性对象,反映您定义的getter或setter,然后将其绑定到您正在定义的函数的名称。因为您要定义的函数名是name,所以它将替换旧的name属性。你知道吗

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

相关问题 更多 >