如何只允许getter/setter获取/设置变量值?
如何只允许getter/setter获取/设置变量值?
这个问题已经有了答案:
在这个例子中,用户仍然可以使用以下方式访问和设置变量:
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
admin 更改状态以发布 2023年5月21日
在Python中,惯例是使用_var_name
来表示某些内容是私有的,但它不像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解释器应用的名称改编。