Python. Декораторы.
Запись от Фаер размещена 13.11.2012 в 16:00
Показов 4611
Комментарии 0
|
В предыдущих записях Мы говорили о клонировании и наследовании - приёмах, позволяющих изменять объекты и классы. Разумеется, Python предоставляет и другие инструменты, используя которые, можно прийти к тому же результату. Одним из таких инструментов, являются декораторы. Декоратор - программный шаблон, оборачивающий некий объект дополнительным уровнем логики. Одним словом, обёртка. Едва ли можно сказать, что использование декораторов упрощает разработку, однако многие программисты находят их очень удобными, а значит есть смысл рассказать о них. В первую очередь, давайте разберём декорирование функций. Нужно заметить, что в Python'е функции являются объектами, их можно передать в качестве аргументов другим функциям, что, в общем-то, и происходит при оборачивании. То есть, декоратор - это функция, принимающая другую функцию в качестве аргумента:
В результате, обращение к функции func происходит не напрямую, а через обёртку. В Нашем случае, сначала выполняется команда print('Done'), описанная в декораторе, а уже потом вызывается сама функция(return func). Казалось бы, всё хорошо. Однако есть одна мелочь, которая несколько омрачает светлый образ декораторов. Дело в том, что декоратор и вложенная в него функция имеют разные пространства имён. Аргументы, переданные func(), недоступны на уровне decor'а. Исправить этот недочёт можно, но для этого нужно вложить в декоратор ещё одну функцию. Например:
Кроме декораторов функций существуют ещё декораторы классов. Возьмём старый добрый класс car(), в котором на этот раз содержится только один метод - конструктор, и посредством оборачивания добавим ему два новых метода:
Обратите внимание на команду return wcar - эта строка возвращает объект, сконструированный по классам car() и wcar(). Если её убрать, то результатом сборки будет объект NoneType, что Нам, конечно же, не нужно. В итоге, Мы получим класс, расширенный декоратором, но не потерявший своих былых свойств. Как Вы уже, наверное, догадались, обёртки можно вкладывать друг в друга. Возьмём пример попроще, чтобы узреть только самую суть:
Согласитесь, даже в таком простом скрипте можно напрочь запутаться. Но не забывайте, что всегда можно написать команду: print(func), которая подскажет на какую функцию ссылается данная переменная. Таковы основы использование декораторов. Трудно назвать их самым понятным способом решения проблем, однако и обёрткам можно найти вполне достойное применение. | ||||||||||||||||||||||||||||||
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии


