__method__
,method
和_method__
之间有什么区别?
是否存在任何或一些随机原因的人认为__doc__
应该是正确的,而不是doc
。什么使一种方法比另一种方法更特殊?
答案 0 :(得分:75)
__method
:私有方法。__method__
:特殊的Python方法。它们的名称是这样的,以防止名称冲突。 Check this page for a list of these special methods. _method
:这是Python style guide中受保护方法的推荐命名约定。来自风格指南:
_single_leading_underscore
:弱“内部使用”指标。例如。from M import *
不会导入名称以下划线开头的对象。
single_trailing_underscore_
:由惯例用于避免与之冲突 Python关键字,例如Tkinter.Toplevel(master, class_='ClassName')
__double_leading_underscore
:在命名类属性时,调用name 修改(在课堂FooBar
内,__ boo变为_FooBar__boo
;见下文)。
__double_leading_and_trailing_underscore__
:“魔法”物品或 存在于用户控制的命名空间中的属性。例如。__init__
,__import__
或__file__
。不要发明这样的名字;只使用它们 记录在案。
答案 1 :(得分:19)
method
只是一种常规方法_method
,这通常意味着你自己编写了这个方法。__method
2个下划线用于防止名称管理。像这样的属性或方法可以通过instance._ClassName__method
访问。虽然很多人称之为“私人”,但不是。您永远不应该使用它来阻止某人访问此方法,而是使用_method
。__method__
用于修改实例行为的特殊方法。不要这样命名你自己的方法。答案 2 :(得分:4)
这些都是惯例,因此无论如何都不会强制执行。不过,你通常可以期待:
__somename__
python语言规范本身定义的东西。不要在自己的命名中使用它。
_somename
这通常应该通过一些不同的机制而不是直接来调用。类似于在大多数其他语言中声明私有内容,但不以任何方式强制执行。
__somename
这是真的不应该被直接调用,并且在内部被破坏以阻止你这么做。如果您确实需要出于某种原因调用它,请查看文档以了解具体方法。
以上任何一项都可以同样适用于函数,变量或类名。
答案 3 :(得分:1)
这些方法的命名是为了减少命名冲突的可能性。
答案 4 :(得分:0)
以双下划线为前缀和前缀的方法通常是如此标记,表明它们是Python语言规范的一部分。
答案 5 :(得分:0)
一些带有双下划线前缀和后缀的方法很特殊。例如,只要创建该类的实例,就会调用__init__
,并且在打印对象时调用__str__
。基本上,它们可以通过特殊方式调用。您可以像使用任何其他方法一样使用它们,也可以通过与它们相关联的特殊方式调用它们。
我不知道双下划线全局函数(不属于任何类),但我认为没有。
答案 6 :(得分:0)
__name__
的模式表示“魔法”方法。这些由各种函数调用,如
str(x) -> x.__str__()
repr(x) -> x.__repr__()
x[0] -> x.__getitem__(0)
etc
单个下划线前缀用于表示私有属性,并且仅遵循约定。
双下划线前缀启动名称修改,其中名为__attr的属性在实例化时更改为__Class_attr。
你对_method__的模式并没有真正用于任何事情。