2

可能重复:
Python中对象名称前的单下划线和双下划线的含义

我在阅读有关私有变量链接的 python 文档时遇到了一个问题。

所以文档告诉它是用下划线命名私有变量的约定,但python不会将该字段设为私有。

>>> class a():
      def __init__(self):
         self.public = 11
         self._priv = 12
>>> b = a()
>>> print b._priv
>>> 12

我想知道是否有一种方法可以在 python 中使变量“真正”私有。

4

3 回答 3

7
  • Guido van Rossum 说:我们都是成年人
  • 扩展版:我们都是成年人。如果必须,请随意射击自己的脚。

如果必须,您可以将其隐藏一点但您真的不应该:

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
于 2013-01-05T05:06:57.377 回答
4

不, Python 对象中没有私有变量或方法。“我们在这里都是同意的成年人”这句话通常用来解释他们被认为是不必要的。

单个下划线有时用于“私人”成员,仅作为惯例购买;它没有任何功能用途。

前导双下划线会导致名称混乱,但仅用于避免子类中的命名冲突。它不提供任何“私人会员安全”,因为您仍然可以找到他们。

于 2013-01-05T05:06:05.370 回答
0

您可以使用双前导下划线来调用 Python 名称修饰。就这样__priv变成了_MyClass__priv。它仍然可以访问,但可以防止子类意外覆盖。

于 2013-01-05T05:08:16.257 回答