Python. Прототипное программирование.
Запись от Фаер размещена 10.11.2012 в 10:44
Показов 4461
Комментарии 0
|
Прототипное программирование - это одна из разновидностей ООП. Отличаются данные парадигмы тем, что основным инструментом ООП является класс, тогда как прототипное программирование предусматривает оперирование непосредственно объектом. Данный стиль не очень-то широко распространён. Python, в частности, не поддерживает ПП напрямую, как, например, Lua или JavaScript. Но, как следует поколдовав, можно реализовать некоторые его приёмы и на Python'е. Чаще всего в таких случаях программисты используют метаклассы, служащие связующим интерфейсом между классом и декоратором(обёрткой). Мы направимся в несколько другую область. Прототип - это объект, принятый за образец, на основе которого штампуются новые экземпляры. Можно сказать, что это, в некотором роде, аналог суперкласса. В ПП трудно обойтись без наследования, которое позволяет дополнить/изменить теперь уже объект, а не класс. Наряду с ним в прототипном программировании очень часто применяется клонирование. Вот клонирование, как более простой приём ПП, Мы и разберём в первую очередь. Как было сказано в прошлой записи, простым присвоением переменной некоего объекта Мы создаём новую ссылку, а не копию экземпляра. А вот для того, чтобы действительно клонировать объект Нам потребуется функция copy():
А теперь давайте клонируем готовый объект несколько другим способом и при этом добавим ему метод. Для этого Мы опишем ещё один класс, который послужит своего рода обёрткой старого.
Должно быть, Вы заметили, что структура нового объекта сложнее. Теперь обращаться к параметру описанному ещё в прототипе(car) нужно через вложенный объект obj. То есть, если Вы напишете
Нужно сделать оговорку, что подобное оборачивание не подходит для расширения объектов, которые уже имеют некоторый набор методов(__init__() за метод не считаем). Однако, потанцевав с бубном, это недоразумение Мы так же сможем исправить:
1. Описываем класс car. Тут всё понятно. 2. Описываем обёртку decor, которая является наследником car. decor'у Мы под переменной obj передаём копию(именно копию, иначе получится не отдельный объект, а ссылка) экземпляра родительского класса. Затем описываем параметр self.obj=obj и поднимаем его содержимое на уровень вверх командой:
Ещё раз, только суть: Мы создаём экземпляр подкласса decor и приравниваем его параметры к параметрам переданной копии объекта - прототипа. В результате Мы получаем два не зависящих друг от друга объекта: 1. прототип(prot) - экземпляр класса car, 2. расширенный клон прототипа(сl). Вывод: Можно, конечно, ругаться на такие абракадабрические выкрутасы, однако клонирование/расширение является мощным инструментом, способным значительно расширить ООП. | |||||||||||||||||||||||||||||||||||
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии


