67

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

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

4

4 回答 4

70

请注意,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:不是每个人都喜欢名字修饰。尝试在避免意外名称冲突的需要与高级呼叫者的潜在使用之间取得平衡。

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

于 2010-08-02T05:51:50.807 回答
42

双下划线。它以一种无法简单地__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而不是访问。但它尖叫着“我是私人的,不要碰我”,这总比没有好。

于 2010-08-02T05:49:34.870 回答
9

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

对半私有使用单下划线(告诉 python 开发人员“只有在绝对必要时才更改它”),双下划线表示完全私有。

于 2010-08-02T05:51:51.367 回答
-4

因为那是编码约定。请参阅此处了解更多信息。

于 2010-08-02T05:52:29.653 回答