下划线与双下划线与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
但是尽量避免
__private
forms。 我从来不使用它。 相信我。 如果你使用它,你会后悔的。说明:
来自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,而不是试图保护开发者自己。