可能重复:
The meaning of a single- and a double-underscore before an object name in Python
当我阅读有关私有变量link的python文档时,我有一个问题。
因此,文档说明使用下划线命名私有变量是一种惯例,但python不会使该字段成为私有。
>>> class a():
def __init__(self):
self.public = 11
self._priv = 12
>>> b = a()
>>> print b._priv
>>> 12
我想知道是否有一种方法可以在python中使变量“真正”私有。
答案 0 :(得分:6)
如果必须,你可以隐藏一点,但你真的不应该这样做:
class NonAdult(object):
def __init__(self):
self.__private_number = '42'
def __getattr__(self, name):
if name.startswith('__private'):
raise AttributeError
if __name__ == '__main__':
na = NonAdult()
print(na.__private_number) # raises AttributeError
print(na.__dict__['_NonAdult__private_number']) # would still return 42
答案 1 :(得分:4)
不,Python objects中没有私有变量或方法。短语“我们都在这里同意成年人”通常用于解释他们被认为是不必要的。
单个下划线有时用于“私人”会员,仅作为惯例购买;它不起作用。
前导双下划线会导致名称重写,但仅用于避免在子类中命名冲突。它不提供任何“私人会员安全”,因为您可以仍然可以访问它们。
答案 2 :(得分:0)
您可以使用双引导下划线来调用Pythons名称修改。因此__priv
变为_MyClass__priv
。它仍然可以访问,但可以防止子类意外覆盖。