Что означают методы подчеркивания?

Я относительно новичок в языке Python и столкнулся с этим при выполнении следующих действий:

help(list)

Вот с чем я столкнулся:

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

Что касается этих, для чего нужны подчеркивания? Поскольку они не используются (насколько мне известно), когда вы используете метод нормально, я пытаюсь понять, почему они нашли время, чтобы написать их с подчеркиванием в документации.

6 ответов

Смотрите руководство по стилю 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, объясняющий использование двойных подчеркиваний:

... вместо того, чтобы разрабатывать новый синтаксис для специальных видов методов класса (таких как инициализаторы и деструкторы), я решил, что эти функции могут быть обработаны, просто требуя от пользователя реализации методов со специальными именами, такими как init, del и т. д. вперед. Это соглашение об именах взято из C, где идентификаторы, начинающиеся с подчеркиваний, зарезервированы компилятором и часто имеют особое значение (например, макросы, такие как FILE в препроцессоре C).

...

Я также использовал эту технику, чтобы позволить пользовательским классам переопределить поведение операторов Python. Как отмечалось ранее, Python реализован на C и использует таблицы указателей функций для реализации различных возможностей встроенных объектов (например, "get attribute", "add" и "call"). Чтобы эти возможности могли быть определены в пользовательских классах, я сопоставил различные указатели функций с именами специальных методов, такими как getattr, add и call. Существует прямое соответствие между этими именами и таблицами указателей функций, которые необходимо определить при реализации новых объектов Python в C.

Также смотрите документацию Python по специальным именам методов, которая читается частично:

Класс может реализовывать определенные операции, которые вызываются специальным синтаксисом (например, арифметические операции или подписка и разрезание), определяя методы со специальными именами. Это подход Python к перегрузке операторов, позволяющий классам определять свое поведение в отношении операторов языка.

В некоторой степени эти подчеркивания не являются чем-то особенным; они просто часть имени метода.

Однако они используются для обозначения "магических" методов, таких как конструкторы и перегруженные операторы. Вы не должны использовать их в своих именах методов. Из 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

Это особые методы (не "dunder" (двойное подчеркивание) делает их особенными, но чаще всего они имеют особое значение). Они часто вызываются при использовании операторов. Вы можете переписать поведение в ваших классах.

Например, если у вас есть класс Cопределяя

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

вы можете определить, что должно произойти, если вы добавите два экземпляра из класса:

val = instance1 + instance2
Другие вопросы по тегам