Какая разница между строковыми методами в 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"
Разницы нет никакой. Это простое удобство.
Вот, например, по поводу метода __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...
Там же находится и описание других методов.