gpt4 book ai didi

python - 试图创建只读属性属性 - getter 返回初始化值,直接访问返回更改后的值

转载 作者:太空宇宙 更新时间:2023-11-04 09:08:52 25 4
gpt4 key购买 nike

虽然我可能对 property() 是什么感到很困惑功能,我正试图用它来创建一个只读的属性。理想情况下,我希望能够直接引用属性但不允许分配给它。实验时,我得到了这个非常奇怪的行为:

>>> class Boo(object):
... def __init__(self, x):
... self.__x = x
... def getx(self):
... return self.__x
... x = property(getx)
...
>>> b = Boo(1)
>>> b.__x = 2
>>> b.getx()
1
>>> b.__x
2

我想补充一点,当我使用 x_x 作为属性名称时,重新分配属性会导致 getter 返回更改后的值,即 b.getx()b.x/b._x 给了我 2

虽然我意识到我正在使用 x 作为属性名称,但是当我尝试以下操作时,我的 __init__() 中出现了 AttributeError :

>>> class Boo(object):
... def __init__(self, x):
... self.__x = x
... def getx(self):
... return self.__x
... __x = property(getx)
...
>>> b = Boo(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __init__
AttributeError: can't set attribute

最佳答案

这里的问题与property无关,而是与双下划线属性有关,这些属性受制于所谓的"Private name mangling"。 .

>>> b = Boo(1)
>>> '__x' in dir(b)
False
>>> '_Boo__x' in dir(b)
True

所以,当你这样做时:

>>> b.__x = 2

您不是在更改 getx 函数正在查看的属性的值,而是在创建一个 属性。

如果您只是为属性使用一个不以两个下划线开头的名称(例如 _x),一切都会按您的预期进行。

作为一般规则,“advisory private”使用单下划线——例如,“这个对象的用户可能不应该关心这个值”,只有当你确实需要 mangling 时才使用双下划线(因为复杂很少出现的继承问题)。

如果你想要“真正的私有(private)”,比如 C++ 或 Java 怎么办?你不能拥有它。如果您足够好地隐藏或保护该属性,有人就会对 getx 方法或 x 属性进行猴子修补。所以,Python 没有提供隐藏属性的方法。

关于python - 试图创建只读属性属性 - getter 返回初始化值,直接访问返回更改后的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17460017/

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