我对Python语言比较陌生,在执行以下操作时遇到了这个问题:
help(list)
这是我遇到的:
__add__(...)
| x.__add__(y) <==> x+y
|
| __contains__(...)
| x.__contains__(y) <==> y in x
|
| __delitem__(...)
| x.__delitem__(y) <==> del x[y]
关于这些,下划线是什么?因为当你正常使用一种方法时,我不习惯(据我所知),我很难理解为什么他们会花时间用文档中的下划线写出来。
答案 0 :(得分:10)
有关详细说明,请参阅the Python style guide。
在实践中:
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.
答案 1 :(得分:3)
在下划线中包装方法名称只是分隔名称空间的一种方法。如果一个方法以下划线开头和结尾,那么它只是一个约定,表明该方法不适合外部代码使用。
您发布的help(list)
简介意味着当您使用Python的语法说e in lst
时,您实际上是在调用lst.__contains__(e)
。
答案 2 :(得分:2)
以下是Python的创建者Guido van Rossum explaining the use of double underscores:
...而不是设计新的语法 对于特殊类的方法 (例如初始化器和 destructors),我决定这些 功能可以简单地处理 要求用户实施 具有特殊名称的方法,如 init , del ,等等。该命名约定取自C 标识符以。开头 下划线由保留 编译器经常有特殊的 含义(例如, FILE 等宏 在C预处理器中。)
...
我还使用这种技术来允许用户类重新定义 Python运营商的行为。如 之前提到过,Python是 在C中实现并使用表格 函数指针实现各种 内置对象的功能 (例如,“获取属性”,“添加”和 “呼叫”)。允许这些功能 在用户定义的类中定义, 我映射了各种函数指针 特殊的方法名称,如 getattr ,添加和调用。这些之间有直接的对应关系 名称和功能表 指针必须定义何时 在C中实现新的Python对象。
另请参阅special method names上的Python文档,其中部分内容为:
一个类可以实现某些 由special调用的操作 语法(例如算术运算) 或者下载和切片) 定义具有特殊名称的方法。 这是Python的运算符方法 重载,允许类 定义自己的行为 语言运营商。
答案 3 :(得分:0)
They are special methods(不是“dunder”(双下划线)使它们变得特别,但通常它们具有特殊含义)。它们通常在使用运算符时调用。您可以覆盖类中的行为。
例如,如果你有一个班级C
,可以通过定义
class C:
def __add__(self, other):
#....
return something
您可以定义如果从类中添加两个实例会发生什么:
val = instance1 + instance2
答案 4 :(得分:0)
在某种程度上,这些下划线并不特别;它们只是方法名称的一部分。
但是,它们用于表示“神奇”方法,例如构造函数和重载运算符。您不应该在自己的方法名称中使用它们。来自PEP 8:
__double_leading_and_trailing_underscore__
:“魔法”物品或 存在于用户控制的命名空间中的属性。例如。__init__
,__import__
或__file__
。不要发明这样的名字;只使用它们 记录在案。
您很少需要直接致电其中任何一项。例如:
MyClass(...)
会致电MyClass.__init__(...)
,a + b
会致电a.__plus__(b)
,str(a)
会致电a.__str__()
。答案 5 :(得分:0)
在这种情况下,双下划线用作表示特殊方法的约定 - 实现为支持语法糖目的和其他特殊接口的方法。
http://docs.python.org/reference/datamodel.html#specialnames