Что означают методы подчеркивания? - PullRequest
5 голосов
/ 16 февраля 2011

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

help(list)

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

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

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

Ответы [ 6 ]

10 голосов
/ 16 февраля 2011

См. Руководство по стилю 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 голосов
/ 16 февраля 2011

Заключение имени метода в подчеркивание - это просто способ разделения пространств имен. Если метод начинается и заканчивается подчеркиванием, это просто соглашение, указывающее, что метод не предназначен для использования внешним кодом.

Сообщение от help(list), которое вы опубликовали, просто означает, что когда вы используете синтаксис Python, чтобы сказать e in lst, вы фактически вызываете lst.__contains__(e).

2 голосов
/ 16 февраля 2011

Вот Гидо ван Россум, создатель Python, объясняющий использование двойных подчеркиваний :

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

...

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

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

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

0 голосов
/ 16 февраля 2011

В этом случае двойные подчеркивания используются в качестве соглашения для обозначения специальных методов - методов, которые реализованы для поддержки синтаксических сахарных целей и других специальных интерфейсов.

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

0 голосов
/ 16 февраля 2011

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

Однако они используются для обозначения «магических» методов, таких как конструкторы и перегруженные операторы. Вы не должны использовать их в своих именах методов. От PEP 8 :

  • __double_leading_and_trailing_underscore__: "магические" объекты или атрибуты, которые живут в управляемых пользователем пространствах имен. Например. __init__, __import__ или __file__. Никогда не изобретайте такие имена; использовать только их как задокументировано.

Вам редко придется звонить кому-либо из них напрямую. Например:

  • MyClass(...) позвонит MyClass.__init__(...),
  • a + b позвонит a.__plus__(b),
  • str(a) позвонит a.__str__().
0 голосов
/ 16 февраля 2011

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

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

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

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

val = instance1 + instance2
...