有人很好地向我解释__method()破坏了,但由于还有很多其他人需要帮助而没有进一步打扰他,我想知道是否有人可以进一步阐述这些差异。
例如我不需要修改但是保持私有所以有人不能做instance._method()?或者它是否只是通过使其独一无二来覆盖另一个变量?我不需要我的内部方法“隐藏”,但因为它们是特定的使用我不希望它们在课外使用。
答案 0 :(得分:223)
来自PEP 8:
_single_leading_underscore
:弱“内部使用”指标。 E.g。
from M import *
不会导入名称以下划线开头的对象。
single_trailing_underscore_
:惯例用于避免与Python关键字冲突,例如
Tkinter.Toplevel(master, class_='ClassName')
__double_leading_underscore
:在命名类属性时,调用name mangling(在课堂FooBar
内,__boo
成为_FooBar__boo
;见下文)。__double_leading_and_trailing_underscore__
:“魔法”物品或 存在于用户控制的命名空间中的属性。例如。__init__
,__import__
或__file__
。不要发明这样的名字;只使用它们 记录在案。
另外,来自David Goodger的Code Like a Pythonista:
属性:
interface
,_internal
,__private
但请尽量避免使用
__private
表单。我从不使用它。相信我。如果你 使用它,你会后悔的。说明:
来自C ++ / Java背景的人特别容易受到影响 过度使用/滥用此“功能”。但
__private
名称不起作用 与Java或C ++相同。他们只是触发了一个名字错误的人 目的是防止子类中的意外命名空间冲突:MyClass.__private
只是MyClass._MyClass__private
。 (注意 甚至这会破坏与子名相同的子类 超类,例如不同模块中的子类。)有可能 从课堂外访问__private
名称,只是不方便 脆弱的(它增加了对超类的确切名称的依赖)。问题在于,一个班级的作者可以合理地认为“这个 属性/方法名称应该是私有的,只能从内部访问 这个类定义“并使用
__private
约定。但后来, 该类的用户可以创建合法需要的子类 访问该名称。所以要么必须修改超类 (可能很难或不可能),或子类代码必须 使用手动损坏的名称(最好是丑陋和脆弱)。Python中有一个概念:“我们都是在这里同意成年人”。如果 您使用
__private
表单,谁保护该属性? 子类的责任是使用来自的属性 正确的超类,超类的责任 正确记录他们的属性。最好使用单引导下划线约定,
_internal
。 “这根本不是名字错误;它只是表明了 其他人“要小心这一点,这是一个内部实施 详情;如果你不完全理解它,请不要碰它。“它只是一个 但是会议。
答案 1 :(得分:111)
单个前导下划线只是一种惯例,意思是“你可能不应该使用它”。它没有阻止某人使用该属性。
双引导下划线实际上会更改属性的名称,以便继承层次结构中的两个类可以使用相同的属性名称,并且它们不会发生冲突。
答案 2 :(得分:11)
Python中没有访问控制。您可以访问类的所有属性,包括错位名称(如_class__variable
)。专注于您的代码和API,而不是试图保护开发人员自己。