категории | RSS

* Специальные методы в 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'"
        print
        return self
    def __rmul__(self, coefficient):
        "Перегружаем операцию 'obj * self'"
        for i in xrange(coefficient):
            print
        return self
    __mul__ = __rmul__
    def __rsub__(self, *args):
        "Перегружаем операцию 'obj - self'"
        print
    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 и читай код без лишних букв.
По крайней мере это подвигнет вас к написанию документации, это уже большое дело.

Virtuos86
2010-05-24T10:55:25Z

Здесь находятся
всего 0. За сутки здесь было 0 человек
Яндекс.Метрика