Python中的私有变量和方法

kur*_*oki 65 python private private-members private-methods

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

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

Dan*_*uev 68

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

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

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

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

如果您的类要进行子类化,并且您具有不希望使用子类的属性,请考虑使用双前导下划线和没有尾随下划线来命名它们.这将调用Python的名称修改算法,其中类的名称被修改为属性名称.如果子类无意中包含具有相同名称的属性,这有助于避免属性名称冲突.

注3:不是每个人都喜欢名字错误.尽量平衡避免意外姓名冲突与高级呼叫者潜在使用的需要.

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


zne*_*eak 38

双下划线.它以这样的方式破坏了名称,使得它无法通过__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'
Run Code Online (Sandbox Code Playgroud)

它将通过_Foo__privateField相反的方式访问.但它尖叫着"我是私人不要接触我",这总比没有好.


use*_*896 9

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

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

  • 不太对劲.单个下划线意味着您正在篡改可能发生变化的对象的未记录属性,您可能会破坏对象维护的不变量,因此如果您决定打破对象封装,您应该准确理解您正在做什么. (7认同)