下划线方法意味着什么?

问题描述 投票:0回答:6

我对Python语言比较陌生,在执行以下操作时遇到了这个问题:

help(list)

以下是我遇到的情况:

__add__(...)
|      x.__add__(y) <==> x+y
|  
|  __contains__(...)
|      x.__contains__(y) <==> y in x
|  
|  __delitem__(...)
|      x.__delitem__(y) <==> del x[y]

关于这些,下划线是做什么用的?因为(据我所知)当您正常使用方法时不会使用它们,所以我很难理解为什么他们会花时间在文档中用下划线写出它们。

python
6个回答
10
投票

请参阅 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.

3
投票

将方法名称用下划线括起来只是分隔命名空间的一种方法。如果一个方法以下划线开头和结尾,这只是一种约定,表明该方法不适合由外部代码使用。

您发布的

help(list)
的简介只是意味着,当您使用 Python 的语法说
e in lst
时,您实际上是在调用
lst.__contains__(e)


2
投票

这里是 Python 的创建者 Guido van Rossum,解释双下划线的使用

...而不是设计新的语法 对于特殊类型的类方法 (例如初始化器和 析构函数),我决定这些 功能可以通过简单地处理 要求用户实现 具有特殊名称的方法,例如 initdel 等等。此命名约定取自 C 其中标识符开头为 下划线被保留 编译器通常有特殊的 含义(例如,诸如 FILE 之类的宏 在 C 预处理器中)。

...

我还使用了这种技术来允许用户类重新定义 Python 运算符的行为。作为 前面提到过,Python 是 用 C 实现并使用以下表格 函数指针来实现各种 内置对象的功能 (例如,“获取属性”、“添加”和 “称呼”)。为了允许这些功能 在用户定义的类中定义, 我映射了各种函数指针 特殊的方法名称,例如 getattraddcall。这些之间有直接的对应关系 名称和函数表 必须定义何时的指针 在 C 中实现新的 Python 对象。

另请参阅关于 特殊方法名称 的 Python 文档,其中部分内容为:

一个类可以实现某些 由特殊调用的操作 语法(例如算术运算 或下标和切片) 定义具有特殊名称的方法。 这是Python的运算符方法 重载,允许类 尊重地定义自己的行为 语言运算符。


0
投票

它们是特殊方法(不是“dunder”(双下划线)使它们变得特殊,但大多数情况下它们具有特殊含义)。使用运算符时经常调用它们。您可以覆盖类中的行为。

例如,如果你有一个类

C
,通过定义

class C:
    def __add__(self, other):
        #....
        return something

您可以定义如果从类中添加两个实例会发生什么:

val = instance1 + instance2

0
投票

从某种程度上来说,这些下划线并没有什么特别的;它们只是方法名称的一部分。

但是,它们用于指示“神奇”方法,例如构造函数和重载运算符。您不应该在自己的方法名称中使用它们。来自PEP 8

  • __double_leading_and_trailing_underscore__
    :“魔法”物体或 存在于用户控制的命名空间中的属性。 例如。
    __init__
    ,
    __import__
    __file__
    。 永远不要发明这样的名字;只使用它们 如记录所示。

您很少需要直接调用其中任何一个。例如:

  • MyClass(...)
    会打电话给
    MyClass.__init__(...)
    ,
  • a + b
    会打电话给
    a.__plus__(b)
    ,
  • str(a)
    会打电话给
    a.__str__()

0
投票

在这种情况下,双下划线用作约定来表示特殊方法 - 为支持语法糖目的和其他特殊接口而实现的方法。

http://docs.python.org/reference/datamodel.html#specialnames

© www.soinside.com 2019 - 2024. All rights reserved.