{ "metadata": { "name": "Capitulo17_Decoradores" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[Python para Desenvolvedores](http://ricardoduarte.github.io/python-para-desenvolvedores/#conteudo)\n", "===================================\n", "2ª edi\u00e7\u00e3o, revisada e ampliada\n", "-----------------------------------\n", "\n", "Cap\u00edtulo 17: Decoradores\n", "=============================\n", "_____________________________\n", "Decoradores (*decorators*) s\u00e3o fun\u00e7\u00f5es que s\u00e3o aplicadas em outras fun\u00e7\u00f5es e retornam fun\u00e7\u00f5es modificadas. Decoradores tanto podem ser usados para criar ou alterar caracter\u00edsticas das fun\u00e7\u00f5es (que s\u00e3o objetos) quanto para \u201cenvolver\u201d as fun\u00e7\u00f5es, acrescentando uma camada em torno delas com novas funcionalidades.\n", "\n", "![Decorador](files/bpypd_diags13.png)\n", "\n", "A partir do Python 2.4, o caractere \u201c@\u201d pode ser usado para automatizar o processo de aplica\u00e7\u00e3o do decorador:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def decorator(f):\n", " f.decorated = True\n", " return f\n", "\n", "@decorator\n", "def func(arg):\n", " return arg" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Com isso, foi criado um atributo novo na fun\u00e7\u00e3o, que pode ser usado depois, quando a fun\u00e7\u00e3o for executada.\n", "\n", "Exemplo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Fun\u00e7\u00e3o decoradora\n", "def dumpargs(f):\n", "\n", " # Fun\u00e7\u00e3o que envolver\u00e1 a outra\n", " def func(*args):\n", "\n", " # Mostra os argumentos passados para a fun\u00e7\u00e3o\n", " print args\n", "\n", " # Retorna o resultado da fun\u00e7\u00e3o original\n", " return f(*args)\n", "\n", " # Retorna a fun\u00e7\u00e3o modificada\n", " return func\n", "\n", "@dumpargs\n", "def multiply(*nums):\n", "\n", " m = 1\n", "\n", " for n in nums:\n", " m = m * n\n", " return m\n", "\n", "print multiply(1, 2, 3)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(1, 2, 3)\n", "6\n" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "A sa\u00edda apresenta os par\u00e2metros que a fun\u00e7\u00e3o decorada recebeu." ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", "" ], "output_type": "pyout", "prompt_number": 1, "text": [ "" ] } ], "prompt_number": 1 } ], "metadata": {} } ] }