gpt4 book ai didi

python - 如何只允许 getter/setter 获取/设置变量值?

转载 作者:行者123 更新时间:2023-12-01 00:35:04 26 4
gpt4 key购买 nike

在此示例中,用户仍然可以使用以下方式访问和设置变量:

obj = C()
obj._x=10
varA = obj._x

即使我们使用 __x而不是_x在下面的代码中,x仍然没有变成私有(private)的。所以_x的唯一目的是让程序员知道它不应该直接通过 obj._x 设置?

class C:
def __init__(self):
self._x = None

@property
def x(self):
"""I'm the 'x' property."""
return self._x

@x.setter
def x(self, value):
self._x = value

@x.deleter
def x(self):
del self._x

最佳答案

在 Python 中,约定使用 _var_name为了表明某些东西是私有(private)的,但它并不像 C++、C#、Java 等语言那样强制执行。

双下划线前缀会导致Python解释器重写属性名称,以避免子类中的命名冲突。

这也称为名称修改 - 解释器以某种方式更改变量的名称,使得稍后扩展类时更难产生冲突。

考虑以下示例

class Test:
def __init__(self):
self.foo = 11
self._bar = 23
self.__baz = 23

现在,让我们运行以下代码:

>>> t = Test()
>>> dir(t)
['_Test__baz', '__class__', '__delattr__', '__dict__', '__dir__',
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__weakref__', '_bar', 'foo']

dir(t)给我们一个包含对象属性的列表。当您搜索__baz时在该列表中,您会看到没有具有该名称的变量。如果仔细观察,您会发现有一个名为 _Test__baz 的属性。在这个物体上。这是 Python 解释器应用的名称修改。

关于python - 如何只允许 getter/setter 获取/设置变量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57859931/

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