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

时间:2013-01-05 05:04:25

标签: python class private

  

可能重复:
  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中使变量“真正”私有。

3 个答案:

答案 0 :(得分:6)

  • 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

答案 1 :(得分:4)

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

单个下划线有时用于“私人”会员,仅作为惯例购买;它不起作用。

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

答案 2 :(得分:0)

您可以使用双引导下划线来调用Pythons名称修改。因此__priv变为_MyClass__priv。它仍然可以访问,但可以防止子类意外覆盖。