Fork me on GitHub

Viagens, opiniões e afins

by Andre Fonseca


Entendendo os decoradores em Python – Parte 1

A um certo tempo atrás me deparei com alguns códigos que usavam o recurso de decorator.  Dali, curioso com tal coisa, resolvi pesquisar para entender melhor como funcionam, para que servem, e quais seriam bons cenários para usá-lo.

Para minha surpresa, achei pouco material e a maioria dos conteúdos que tratavam do assunto eram superficiais. Outros que abordavam mais a prática (ou associada a um problema único), alguns falavam de forma extremamente complexa, etc. Além de tudo isso, quase nenhum dos artigos eram em português: o tema é complicado e sem fluência no inglês a coisa tende a piorar.

Como recompensa ao esforço a determinação, achei um excelente texto (fonte altamente confiável): Bruce Eckel, no site Artima.  O artigo aborda justamente de forma abrangente o assunto, decorator do python, e dando o enfoque que procurava (funcionamento, porque usar, como usar, quando usar) .  Então, como forma de dar minha retribuição a comunidade, segue uma versão do texto dele (não é uma tradução, parte irei reproduzir, outras colocarei minha visão).

Primeira coisa que considero interessante, que o está no texto próprio original,  é que necessitamos desfazer alguns conceitos erróneos sobre Decoradores. Muita gente quando escuta decorators logo remete seu pensamento aos padrões de projeto, mais precisamente, o padrão Decorator.  Esse padrão é feito para possibilidade de forma simples adicionar  recursos, detalhes, adornos a uma classe, inclusive em tempo de execução. Aqui eles tem mais uma carinha de Macros, do que decoradores.

O objetivo das macros é de permitir alterar os elementos de uma linguagem. Isto é exatamente oque os decoradores em Python fazem – eles modificam  funções e classes inteiras (existem decorators para classes) .  Isso é porque eles usualmente provem um caminho alternativo ao uso de metaclass.

A grande parte das linguagens que suportam tal recurso (auto-modificação)  falham no quesito complexidade :  elas são tanto restritivas e requerem, em alguns casos, uma linguagem diferente. Python se faz a pergunta: porque não fazê-lo em python mesmo? Porque não permitir escrever macros ou decoradores na própria linguagem permitindo uma interação maior ? Esse é exatamente a proposta dos decoradores.

Porque usar Decorators?

Decorators permitem que se altere a execução de um método ou classe. Para que os conhecem, lembra bastante o AOP (Aspect Oriented Programming – programação orientada a aspecto) .  A diferença que não precisamos muitas coisas ou grandes conhecimentos, oque torna muito interessante e legal, mesmo que para iniciantes.

Um exemplo de uso, didático,  é escrever algo que permita fazer algo antes e depois da execução de uma função.

@meuDecorator
def funcaoQualquer():
print "Ola Mundo"

A clásula acima @, define a chamada ao meu decorator que irá fazer algo, quando este método for chamado. Algo semelhante a uma proxy.(veja mais sobre a sintaxe clicando aqui)

Published by Andre, on dezembro 4th, 2009 at 9:14 pm. Filled under: codigo,python Tags: , , 6 Comments

6 Responses to “Entendendo os decoradores em Python – Parte 1”

  1. Muito legal o artigo, mas cadê o resto ? Vc parou do nada ?
    Abs.
    Diego

    Comentário by Diego on 14 de março de 2011 at 19:01



  2. Vou voltar a escrever sobre o assunto e prometo publicar em breve. Valeu pelo comentário

    Comentário by Andre on 14 de março de 2011 at 22:45



  3. OXe!!! Cadê o restante?

    Comentário by byhanjo on 23 de outubro de 2011 at 22:19



  4. Preciso parar e escrever o restante. Obrigado pelo feedback.

    Comentário by Andre on 24 de outubro de 2011 at 14:22



  5. Cara, muito bom mesmo o artigo.
    Mas, cadê as outras partes? Vai ter?
    Vlw!

    Comentário by Guilherme on 9 de novembro de 2011 at 19:48



  6. Dá uma olhado nos post mais recentes que coloquei coisa nova lá

    Comentário by Andre on 15 de novembro de 2011 at 0:18



Leave a Reply