* Специальные методы в Python -- это методы (объектов), имена которых начинаются и заканчиваются с двух символов подчеркивания "_", например, "__add__".
С помощью этих методов реализуется поведение объектов при применении к ним унарных или бинарных операторов, таких как "+", "-", "/", "*" и т.д. и т.п.
Также с помощью этих методов осуществляется перегрузка операторов, простой пример которой я сейчас и приведу:
class put:
"""
Использование:
- self # эквивалент 'print'
self - obj # print obj
self - obj1 - obj2 # print obj1, obj2
self - obj - put #print obj1; print
self * n # 'print; print; ...; print' n раз
(lambda obj: self - obj) # def foo(x): print x%2
'"""
def __repr__(self):
return ''
def __neg__(self):
"Перегружаем операцию '- self'"
return self
def __rmul__(self, coefficient):
"Перегружаем операцию 'obj * self'"
for i in xrange(coefficient):
return self
__mul__ = __rmul__
def __rsub__(self, *args):
"Перегружаем операцию 'obj - self'"
def __sub__(self, *args):
"Перегружаем операцию 'self - obj'."
for i in args:
print i
return self
put = put() # Больше нам класс не нужен, поэтому в ту же переменную помещаем экземпляр вместо класса
- put # print
put - 2 #print 2
put - 3 - 4 #print 3, 4
put - 5 - put #print 2; print
(lambda x: put - x%2)(2) # def foo(x): print x%2
# foo()
2 * put # print; print
put * 2 # print; print
Для перегрузки операторов можно придумать много применений, наиболее очевидное - упрощение синтаксиса вашего приложения за счет создания собственного встроенного DSL.
Например, можно придумать такую конструкцию:
document/3 -= 'пингвин'
и реализовать class Document, для экземпляра (document) которого эта строка будет абсолютно корректной инструкцией и будет означать: перейти к строке 3 document и удалить из неё всех 'пингвин'-ов.
В то время как с помощью обычных методов это бы пришлось записывать примерно так:
document.set_line(3).remove_from_line('пингвин')
Так безусловно понятнее, но что если подобных комбинаций вызовов станет слишком много? А так ознакомился по докстрингам с синтаксисом DSL и читай код без лишних букв.
По крайней мере это подвигнет вас к написанию документации, это уже большое дело.