gpt4 book ai didi

python - 为什么 property.fget 是只读属性?

转载 作者:太空狗 更新时间:2023-10-30 00:00:29 26 4
gpt4 key购买 nike

我目前正在修补库中某个类的属性,以使其更加通用。

我正在使用以下运行良好的代码执行此操作:

_orig_is_xhr = BaseRequest.is_xhr.fget
_orig_is_xhr_doc = BaseRequest.is_xhr.__doc__
BaseRequest.is_xhr = property(lambda self: _orig_is_xhr(self) or
'_iframe-xhr' in request.form, doc=_orig_is_xhr_doc)

但是,如果我可以简单地覆盖 getter 函数以便保留文档字符串,那就更好了:

_orig_is_xhr = BaseRequest.is_xhr.fget
BaseRequest.is_xhr.fget = lambda self: (_orig_is_xhr(self) or
'_iframe-xhr' in request.form)

这不起作用,因为 property.fget 是一个只读属性(TypeError: readonly attribute 试图分配给它时)。我很好奇这是否有特殊原因,或者 python 开发人员只是认为在创建属性后修改属性而不用新属性替换它是没有意义的。

最佳答案

您可能是对的,将这些属性设置为只读只是一种约定,选择使属性“全有或全无”。允许事后分配这些似乎更“Pythonic”一点,但在 Python 2.2 release notes 中找不到理由(引入属性时)。

Objects/descrobject.c该属性的成员属性被定义为只读:

    static PyMemberDef property_members[] = {
{"fget", T_OBJECT, offsetof(propertyobject, prop_get), READONLY},
{"fset", T_OBJECT, offsetof(propertyobject, prop_set), READONLY},
{"fdel", T_OBJECT, offsetof(propertyobject, prop_del), READONLY},
{"__doc__", T_OBJECT, offsetof(propertyobject, prop_doc), READONLY},
{0}
};

旁白:如果您将 READONLY 替换为 0 并编译,这就是允许分配 fget、fset、.. 所需的一切:

class Test(object):
def __init__(self):
self.flag = True
prop = property(lambda self: self.flag)

obj = Test()
print obj.prop
Test.prop.fget = lambda self: not self.flag
print obj.prop

输出:

True
False

关于python - 为什么 property.fget 是只读属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5765567/

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