【发布时间】:2020-01-11 13:40:56
【问题描述】:
在此示例中,用户仍然可以使用以下方法访问和设置变量:
obj = C()
obj._x=10
varA = obj._x
即使我们在下面的代码中使用__x 而不是_x,x 仍然不会变成私有的。所以_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 是一种用于“同意的成年人”的语言;也就是说,我们可以通过前导下划线指示变量是私有的,但我们不会像 C++/C#/Java 那样强制执行隐私。双下划线有一个特定的目的:模仿其他语言的访问修饰符不是那个目的。
-
即使是前导双下划线也不会阻止修改,只会让它“更难”stackoverflow.com/questions/1301346/…
-
Python 没有私有的。甚至没有双下划线名称修改。这不是双下划线名称修饰的目的。您使用属性的示例不是您应该做的。
-
好吧,在这个例子中,属性的目的是确保当使用 obj.x 分配或获取值时,它会调用适当的 getter/setter,如果有的话,它将应用逻辑然后分别从/到_x获取/设置值
-
@variable 在这种情况下,您应该(可能)将属性分配给 everywhere,即使在
__init__中也是如此,而不是绕过并直接分配给_x.
标签: python python-3.x