我对Python语言比较陌生,在执行以下操作时遇到了这个问题:
help(list)
以下是我遇到的情况:
__add__(...)
| x.__add__(y) <==> x+y
|
| __contains__(...)
| x.__contains__(y) <==> y in x
|
| __delitem__(...)
| x.__delitem__(y) <==> del x[y]
关于这些,下划线是做什么用的?因为(据我所知)当您正常使用方法时不会使用它们,所以我很难理解为什么他们会花时间在文档中用下划线写出它们。
请参阅 Python 风格指南 以获取全面的解释。
实践中:
the following special forms using leading or trailing
underscores are recognized (these can generally be combined with any case
convention):
- _single_leading_underscore: weak "internal use" indicator. E.g. "from M
import *" does not import objects whose name starts with an underscore.
- single_trailing_underscore_: used by convention to avoid conflicts with
Python keyword, e.g.
Tkinter.Toplevel(master, class_='ClassName')
- __double_leading_underscore: when naming a class attribute, invokes name
mangling (inside class FooBar, __boo becomes _FooBar__boo; see below).
- __double_leading_and_trailing_underscore__: "magic" objects or
attributes that live in user-controlled namespaces. E.g. __init__,
__import__ or __file__. Never invent such names; only use them
as documented.
将方法名称用下划线括起来只是分隔命名空间的一种方法。如果一个方法以下划线开头和结尾,这只是一种约定,表明该方法不适合由外部代码使用。
您发布的
help(list)
的简介只是意味着,当您使用 Python 的语法说 e in lst
时,您实际上是在调用 lst.__contains__(e)
。
这里是 Python 的创建者 Guido van Rossum,解释双下划线的使用:
...而不是设计新的语法 对于特殊类型的类方法 (例如初始化器和 析构函数),我决定这些 功能可以通过简单地处理 要求用户实现 具有特殊名称的方法,例如 init、del 等等。此命名约定取自 C 其中标识符开头为 下划线被保留 编译器通常有特殊的 含义(例如,诸如 FILE 之类的宏 在 C 预处理器中)。
...
我还使用了这种技术来允许用户类重新定义 Python 运算符的行为。作为 前面提到过,Python 是 用 C 实现并使用以下表格 函数指针来实现各种 内置对象的功能 (例如,“获取属性”、“添加”和 “称呼”)。为了允许这些功能 在用户定义的类中定义, 我映射了各种函数指针 特殊的方法名称,例如 getattr、add 和 call。这些之间有直接的对应关系 名称和函数表 必须定义何时的指针 在 C 中实现新的 Python 对象。
另请参阅关于 特殊方法名称 的 Python 文档,其中部分内容为:
一个类可以实现某些 由特殊调用的操作 语法(例如算术运算 或下标和切片) 定义具有特殊名称的方法。 这是Python的运算符方法 重载,允许类 尊重地定义自己的行为 语言运算符。
它们是特殊方法(不是“dunder”(双下划线)使它们变得特殊,但大多数情况下它们具有特殊含义)。使用运算符时经常调用它们。您可以覆盖类中的行为。
例如,如果你有一个类
C
,通过定义
class C:
def __add__(self, other):
#....
return something
您可以定义如果从类中添加两个实例会发生什么:
val = instance1 + instance2
从某种程度上来说,这些下划线并没有什么特别的;它们只是方法名称的一部分。
但是,它们用于指示“神奇”方法,例如构造函数和重载运算符。您不应该在自己的方法名称中使用它们。来自PEP 8:
:“魔法”物体或 存在于用户控制的命名空间中的属性。 例如。__double_leading_and_trailing_underscore__
,__init__
或__import__
。 永远不要发明这样的名字;只使用它们 如记录所示。__file__
您很少需要直接调用其中任何一个。例如:
MyClass(...)
会打电话给MyClass.__init__(...)
,a + b
会打电话给a.__plus__(b)
,str(a)
会打电话给a.__str__()
。在这种情况下,双下划线用作约定来表示特殊方法 - 为支持语法糖目的和其他特殊接口而实现的方法。
http://docs.python.org/reference/datamodel.html#specialnames