Какая разница между строковыми методами в Python с двойным подчеркиванием и без?

Приветствую

В Python новичек и в голове возникает диссонанс: открываю официальную документацию Python 3 по строкам – описаны одни методы. Открываю в PyCharm справку помощи по строкам (help(str)) и вижу другую картину – в дополнение имеется еще много других методов, записанных через двойное подчеркивание названия метода.

Для наглядности возьмем два простых примера:
a = '012345'

print(len(a))
print(a.__len__())


print(a + '-678')
print(a.__add__('-678'))


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

P.S.
В дополнение хотелось бы узнать разницу в выводе информации справки помощи в терминале и в программе Pycharm. В терминале выводится короткая справка по строкам, буквально три метода, а в Pycharm выводится обширная справка. Почему так и можно ли в терминале вывести полную справку?
  • Вопрос задан
  • 725 просмотров
Решения вопроса 4
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Говоря о специальных методах, нужно все время помнить, что они предназначены для вызова интерпретатором, а не вами. Вы пишете не my_object.__len__ (), а len(my_object), и, если my_object - экземпляр определенного пользователем класса, то Python вызовет реализованный вами метод экземпляра __len__. Однако для встроенных классов, например list, str, bytearray и т. д., интерпретатор поступает проще: реализация функции len() в CPython возвращает значение поля ob_size C-структуры PyVarObject, которой представляется любой встроенный объект в памяти. Это гораздо быстрее, чем вызов метода.
Как правило, специальный метод вызывается неявно. Например, предложение
for i in х: подразумевает вызов функции iter(х), которая, в свою очередь, может
вызывать метод х.__iter__ ( ), если он реализован.

Лучано Рамальо "Fluent Python"
Ответ написан
Комментировать
@CobaltTheTerrible
Копипастю код на Python
Разницы нет никакой. Это простое удобство.

Вот, например, по поводу метода __add__ документация сообщает:
For instance, to evaluate the expression x + y, where x is an instance of a class that has an __add__() method, x.__add__(y) is called.


Т.е. когда вы пишите a+'-678', то за вас это будет преобразовано в a.__add__('-678')

P.S. Про __len__ - https://docs.python.org/3.5/reference/datamodel.ht...
Там же находится и описание других методов.
Ответ написан
Комментировать
@Cyrus
Это магические методы которые позволяют в том числе и переопределение операторов. Например вы можете реализовать методы __len__, __getitem__, __setitem__ и т.д. в своем классе и эмулировать последовательность, обходить ее циклами, обращаться по индексу и диапазону к элементам.

Что касается len, он эквивалентен:
def len(x):
      return x.__len__()


Таким образом использование магических методов напрямую не несет преимуществ.
Ответ написан
Комментировать
@fireSparrow
Методы с двойным подчёркиванием не предназначены для непосредственного вызова. То есть сделать так можно, но особого смысла в этом нет.

Эти методы (их называют "волшебными") в основном служат для переопределения стандартного поведения объектов на уровне классов.
Более подробно можно легко загуглить по запросу "волшебные методы python".
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы