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

Actual implementation of private variables in python class

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
The meaning of a single- and a double-underscore before an object name in Python

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

因此,文档告诉我们,用下划线命名私有变量是一种约定,但python不会使字段私有。

1
2
3
4
5
6
7
>>> class a():
      def __init__(self):
         self.public = 11
         self._priv = 12
>>> b = a()
>>> print b._priv
>>> 12

我想知道是否有一种方法可以让一个变量在Python中"真正的"私有化。


  • 吉多·范·罗森说:我们都是成年人。
  • 扩展版:我们都是成年人。如果必须的话,你可以自由的开枪打自己的脚。

如果必须的话,你可以隐藏一点,但你真的不应该:

1
2
3
4
5
6
7
8
9
10
11
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


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

单个下划线有时用于"私有"成员,仅作为约定购买;它不起作用。

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


您可以使用双前导下划线来调用pythons名称管理。因此,__priv变为_MyClass__priv。它仍然是可访问的,但防止子类意外重写。