python类中私有变量的实际实现

python类中私有变量的实际实现,python,class,private,Python,Class,Private,可能重复: 我在阅读关于私有变量的python文档时遇到了一个问题 因此,文档告诉我们,用下划线命名私有变量是一种惯例,但python并没有将字段设置为私有 >>> class a(): def __init__(self): self.public = 11 self._priv = 12 >>> b = a() >>> print b._priv >>> 12 我想知道

可能重复:

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

因此,文档告诉我们,用下划线命名私有变量是一种惯例,但python并没有将字段设置为私有

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

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

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

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

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

  • 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

您可以使用双前导下划线来调用Pythons名称混乱。所以
\uuuu priv
变成了
\uMyClass\uuuu priv
。它仍然可以访问,但可以防止子类意外重写。

+1用于证明自己是错误的!在您提到的链接中,没有具体提到类成员,这是一个关于私有方法和变量的一般性问题。正如您现在可能看到的,除了先阅读Python文档(好极了!),在发布自己的问题之前搜索StackOverflow以查找类似问题通常非常有用。发布答案也是如此,但这样做的人更少。当然,任何人都可以通过被损坏的名字来访问它。