强调方法意味着什么?

时间:2011-02-16 13:52:02

标签: python double-underscore

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

help(list)

这是我遇到的:

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

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

6 个答案:

答案 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