【发布时间】:2010-10-30 10:33:56
【问题描述】:
__method__、method 和 _method__ 有什么区别?
是否有任何或出于某种随机原因,人们认为__doc__ 应该是正确的,而不是doc。是什么让一种方法比另一种更特别?
【问题讨论】:
__method__、method 和 _method__ 有什么区别?
是否有任何或出于某种随机原因,人们认为__doc__ 应该是正确的,而不是doc。是什么让一种方法比另一种更特别?
【问题讨论】:
__name__ 的模式表示“魔法”方法。这些由各种函数调用,例如
str(x) -> x.__str__()
repr(x) -> x.__repr__()
x[0] -> x.__getitem__(0)
etc
单下划线前缀表示私有属性,只遵循约定。
双下划线前缀启动名称修改,其中名为 __attr 的属性在实例化时更改为 __Class_attr。
你的 _method__ 模式并没有真正用于任何事情。
【讨论】:
__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:命名类属性时,调用名称 mangling(在FooBar类中,__boo 变为_FooBar__boo;见下文)。
__double_leading_and_trailing_underscore__:“魔法”对象或 存在于用户控制的命名空间中的属性。例如。__init__,__import__或__file__。永远不要发明这样的名字;只使用它们 记录在案。
【讨论】:
method 只是普通方法_method,这通常意味着您自己编写了该方法。__method 2 个下划线用于防止名称篡改。可以通过instance._ClassName__method 访问此类属性或方法。尽管很多人称其为“私人”,但它不是。您永远不应该使用它来阻止某人访问此方法,而是使用 _method。__method__ 用于修改实例行为的特殊方法。不要这样命名自己的方法。【讨论】:
这些都是约定,因此无论如何都不会强制执行。不过,您通常可以期待:
__somename__
在 python 语言规范本身中定义的东西。不要在自己的命名中使用它。
_somename
这通常应该通过一些不同的机制而不是直接调用。类似于在大多数其他语言中声明私有内容,但不以任何方式强制执行。
__somename
这真的不应该被直接调用,并且在内部被破坏以阻止你意外地这样做。如果您出于某种原因确实需要调用它,请查看文档以了解如何调用它。
以上任何一项都可以同样适用于函数、变量或类名。
【讨论】:
一些带有双下划线前缀和后缀的方法是特殊的。例如,每当创建该类的实例时调用__init__,而当要打印对象时调用__str__。基本上,它们可以通过特殊方式调用。您可以像使用任何其他方法一样使用它们,也可以通过与它们关联的特殊方式调用它们。
我不知道双下划线全局函数(不属于任何类),但我认为没有。
【讨论】:
这些方法被这样命名是为了减少命名冲突的可能性。
【讨论】:
以双下划线开头和前缀的方法通常被标记为表明它们是 Python 语言规范的一部分。
【讨论】: