Питон — модули, пакеты, классы, экземпляры | страница 4



self.foo += v

return self.foo

Создадим экземпляр этого класса: p = Process(), и передадим этот объект в map вместо функции: result = map(p, sequence). Функция map, ничего не подозревая, будет вызывать переданный ей объект как функцию с одним параметром. Никаких проблем - мы так описали класс, что его экземпляры можно вызывать, и именно с одним параметром! И от итерации к итерации объект p сохраняет необходимое состояние.

Другой похожий пример:

class Process:

def __init__(self):

self.sum = 0


def add(self, v):

self.sum += v

return self.sum


p = Process()

result = map(p.add, sequence)

print p.sum

Вся разница в этом примере - мы передаем не объект p, а его метод p.add. Но что такое p.add? В Python это особая сущность, называемая BoundMethod. Это объект, который помнит адрес объекта p, адрес функции add класса Process, и, когда его вызывают, в свою очередь вызывает метод класса с правильным первым параметром self. Если обратиться к этому методу как Process.add, то это - UnboundMethod, и его надо вызывать, подставив все параметры в явном виде: Process.add(p, 1). Вызов в таком виде часто используется для вызова родительского конструктора или метода:

class Foo(Bar)

def __init__(self):

Bar.__init__(self)

Еще один вариант использования этого трюка - сортировка списков. Списки в Питоне имеют метод sort(), который принимает параметр - функцию сравнения. Если сравнение сложное, и зависит от внешних условий, в качестве функции можно передать заранее проинициализированный объект.