下划线与双下划线与variables和方法

有人很高兴向我解释__method()损坏,而不是进一步打扰他,因为有很多其他人需要帮助,我想知道是否有人可以进一步阐明差异。

例如,我不需要修改,但是保持私有,所以有人不能做instance._method()? 还是它使它不再覆盖另一个variables? 我不需要我的内部方法“隐藏”,但由于它们是特定的使用,我不希望他们在课堂以外使用。

从PEP 8 :

  • _single_leading_underscore :弱的“内部使用”指标。 例如

    from M import *

    不会导入名称以下划线开头的对象。

  • single_trailing_underscore_single_trailing_underscore_使用,以避免与Python关键字冲突,例如

    Tkinter.Toplevel(master, class_='ClassName')

  • __double_leading_underscore :命名一个类属性时,调用名字改变(在类FooBar__boo变成_FooBar__boo ;见下文)。

  • __double_leading_and_trailing_underscore__ :位于用户控制的命名空间中的“魔术”对象或属性。 例如__init____init__ __import____file__ 。 不要发明这样的名字; 只有按照logging使用它们。

另外,David Goodger的“python法典”(Code Like a Pythonista)

属性: interface_internal__private _internal

但是尽量避免__privateforms。 我从来不使用它。 相信我。 如果你使用它,你会后悔的。

说明:

来自C ++ / Java背景的人特别容易过度使用/滥用这个“function”。 但__private名称的工作方式与Java或C ++中的不同。 他们只是触发一个名字混杂,其目的是为了防止在子类中意外的命名空间冲突: MyClass.__private只是成为MyClass._MyClass__private 。 (请注意,即使这个与超类名称相同的子类也是如此,例如在不同模块中的子类)。可能从类的外部访问__private名称,只是不方便和脆弱(它增加了依赖于名称的确切名称超类)。

问题是,一个类的作者可能会合理地认为“这个属性/方法名称应该是私有的,只能从这个类定义中访问”,并使用__private约定。 但是稍后,该类的用户可能会创build一个合法需要访问该名称的子类。 所以要么修改超类(这可能是困难的或不可能的),要么子类代码必须使用手工修改的名字(最好是丑陋的和脆弱的)。

Python中有一个概念:“我们都在这里同意大人”。 如果您使用__private表单,那么您保护的属性是__private ? 正确地使用超类的属性是子类的责任,超类有责任正确地logging它们的属性。

最好使用单_internal下划线约定, _internal 。 “这个名字根本就没有改变,只是向别人指出:”要小心这个,这是一个内部的实现细节; 如果你不完全了解它,请不要触摸它“,这只是一个惯例。

一个主要的下划线只是一个约定,意思是“你可能不应该使用这个”。 它不会阻止某人使用该属性。

双引号下划线实际上改变了属性的名称,这样inheritance层次结构中的两个类可以使用相同的属性名称,并且不会相互冲突。

Python中没有访问控制。 您可以访问一个类的所有属性,并且包含错​​位的名称(如_class__variable )。 专注于你的代码和API,而不是试图保护开发者自己。