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

vee*_*psk 2 python private class

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

当我在私有变量链接上阅读python文档时,我有一个问题.

因此,文档说明使用下划线命名私有变量是一种约定,但python不会使该字段为私有.

>>> class a():
      def __init__(self):
         self.public = 11
         self._priv = 12
>>> b = a()
>>> print b._priv
>>> 12
Run Code Online (Sandbox Code Playgroud)

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

mik*_*iku 6

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

它可以隐藏了一下,如果你一定要,但你真的shoudn't:

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
Run Code Online (Sandbox Code Playgroud)


Jon*_*art 5

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

有时,单个下划线用于“私人”成员,仅作为约定购买;它没有任何功能性目的。

前导双下划线会导致名称修改,但只是为了避免子类中的命名冲突。它不提供任何“私人成员安全”,因为您仍然可以访问它们。