gpt4 book ai didi

Python 属性实例行为

转载 作者:行者123 更新时间:2023-11-28 22:52:00 25 4
gpt4 key购买 nike

我知道什么是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) 没有。

有人能解释一下这是为什么还是我遗漏了什么?

最佳答案

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

@name.getter

@name.setter

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

关于Python 属性实例行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20899900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com