Python中的私有变量和方法

时间:2010-08-02 05:46:54

标签: python private private-members private-methods

  

可能重复:
  The meaning of a single- and a double-underscore before an object name in Python

对于Python中的私有成员和方法,我应该使用_foo(下划线)或__bar(双下划线)?

4 个答案:

答案 0 :(得分:68)

请注意,Python中没有“私有方法”这样的东西。双下划线只是名称错误:

>>> class A(object):
...     def __foo(self):
...         pass
... 
>>> a = A()
>>> A.__dict__.keys()
['__dict__', '_A__foo', '__module__', '__weakref__', '__doc__']
>>> a._A__foo()

因此,当您需要进行修改时,__前缀非常有用,例如不与继承链上或下的名称冲突。对于其他用途,单个下划线会更好,恕我直言。

编辑,关于__上的混淆,PEP-8非常清楚:

  

如果您的类要进行子类化,并且您具有属性   您不希望子类使用,请考虑使用它们命名   双引导下划线和没有尾随下划线。这会调用   Python的名称修改算法,其中类的名称是   被破坏成属性名称。 这有助于避免使用属性名称   碰撞应该是子类无意中包含的属性   同名。

     

注3:不是每个人都喜欢名字错误。尝试平衡   需要避免意外的名字冲突与潜在的使用   高级来电者。

因此,如果您不希望子类意外地重新定义具有相同名称的自己的方法,请不要使用它。

答案 1 :(得分:37)

双下划线。它以这样的方式破坏了名称,以至于无法通过类外部的__fieldName简单地访问它,如果它们是私有的,那么就是你想要开始的。 (虽然进入该领域仍然不是很难。)

class Foo:
    def __init__(self):
        self.__privateField = 4;
        print self.__privateField # yields 4 no problem

foo = Foo()
foo.__privateField
# AttributeError: Foo instance has no attribute '__privateField'

可以通过_Foo__privateField访问它。但它尖叫着“我私下不要碰我”,这比什么都没有好。

答案 2 :(得分:9)

双下划线。这破坏了这个名字。仍然可以访问该变量,但这样做通常是个坏主意。

使用单个下划线进行半私有(告诉python开发人员“只有在绝对必须时才更改此内容”)并且双倍完全私有。

答案 3 :(得分:-4)

因为那是编码惯例。 有关详情,请参阅here