Python中的私有variables和方法
可能重复:
Python中的对象名之前的单下划线和双下划线的含义
我应该在Python中为私有成员和方法使用_foo(下划线)还是__bar(双下划线)?
请注意,Python中没有“private method”这样的东西。 双下划线只是名字的变形:
>>> class A(object): ... def __foo(self): ... pass ... >>> a = A() >>> A.__dict__.keys() ['__dict__', '_A__foo', '__module__', '__weakref__', '__doc__'] >>> a._A__foo()
所以,当你需要发生mangling时, __
前缀是有用的,例如,不要和inheritance链上下的名字冲突。 对于其他用途,单下划线会更好,恕我直言。
编辑,关于__
, PEP-8上的混淆很明显:
如果你的类想要被子类化,并且你有不希望子类使用的属性,考虑用双引号强调下划线并且不用尾随下划线。 这将调用Python的名字manglingalgorithm,其中类的名称被改写为属性名称。 这有助于避免属性名称冲突,如果子类无意中包含具有相同名称的属性。
注3:不是每个人都喜欢名字捣毁。 尝试平衡需要避免意外的名称冲突与高级来电者的潜在使用。
所以,如果你不希望子类意外地重新定义自己的同名方法,不要使用它。
双下划线。 这个名字的修改方式使得它不能简单地通过类外部的__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
来访问。 但它尖叫着“我私下不要碰我”,这总比没有好。
双下划线。 这个名字哗然。 variables仍然可以被访问,但这样做通常是一个坏主意。
使用单个下划线为半私人(告诉Python开发人员“只有当你绝对必须改变这一点”)和双重完全私人。
因为那是编码惯例。 看到这里更多。