Олег Бройтман - Питон - модули, пакеты, классы, экземпляры.
- Название:Питон - модули, пакеты, классы, экземпляры.
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Олег Бройтман - Питон - модули, пакеты, классы, экземпляры. краткое содержание
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.
Питон - модули, пакеты, классы, экземпляры. - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Еще один способ использования классов (точнее, экземпляров), не связанный непосредственно с ОО-программированием - использование пространства имен, которое предоставляет объект. Рассмотрим следующую проблему. Вам надо пройти циклом по списку, сохраняя между итерациями цикла некоторую информацию. Это можно сделать циклом for, никаких проблем. А можно воспользоваться возможностями функционального программирования, которые есть в Питоне - функциями map, filter, reduce и тому подобное. Эти функции требую в качестве первого параметра функцию, которую они в процессе цикла вызывают. Это эффективнее, чем цикл for (эти функции-то написаны на C), но возникает проблема с хранением состояния между итерациями. Функция, которую вызывает map может хранить состояние только в глобальных переменных. Для простых программ это вполне приемлемо. Но вот, скажем, с многопоточными программами будут проблемы - необходимо запирать и синхронизировать доступ к глобальным переменным. Да и вообще к глобальным переменным надо обращаться только при крайней нужде.
Вот тут на помощь приходит дополнительное пространство имен, существующее в экземпляре класса. Создадим класс
class Process:
def __init__(self):
self.foo = 0
def __call__(self, v):
if self.foo > 100:
raise OverflowError
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(), который принимает параметр - функцию сравнения. Если сравнение сложное, и зависит от внешних условий, в качестве функции можно передать заранее проинициализированный объект.
Интервал:
Закладка: