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.
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)
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
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
OXe!!! Cadê o restante?
Comentário by byhanjo on 23 de outubro de 2011 at 22:19
Preciso parar e escrever o restante. Obrigado pelo feedback.
Comentário by Andre on 24 de outubro de 2011 at 14:22
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
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