Что означают методы подчеркивания?
Я относительно новичок в языке 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__()
,
В этом случае двойные подчеркивания используются в качестве соглашения для обозначения специальных методов - методов, которые реализованы для поддержки синтаксических сахарных целей и других специальных интерфейсов.
Это особые методы (не "dunder" (двойное подчеркивание) делает их особенными, но чаще всего они имеют особое значение). Они часто вызываются при использовании операторов. Вы можете переписать поведение в ваших классах.
Например, если у вас есть класс C
определяя
class C:
def __add__(self, other):
#....
return something
вы можете определить, что должно произойти, если вы добавите два экземпляра из класса:
val = instance1 + instance2