Então, vamos falar sobre algumas das aplicações práticas dos decoradores, quero dizer, já vimos nas
aulas, certo?
Vimos como o método de classe e o método estático foram capazes de criar métodos de classe e métodos estáticos na classe
que a classe direta pode usar.
E se você não se lembra deles, basta voltar para aqueles vídeos.
Mas quero mostrar a vocês um dos meus exemplos favoritos de decorador, vamos criar o nosso próprio.
O que vamos fazer é querer uma apresentação.
Decorator e por falar nisso, este decorador não existe no Python, vamos construí-lo do zero.
O que eu quero fazer é poder ter um decorador de desempenho que eu possa usar durante o teste do meu código para ver
quão rápido ele é executado.
Por exemplo, se eu tivesse uma função, digamos que demorasse muito.
Bem, muito tempo para ser concluído, então vou fazer um loop muito longo e dizer para mim na faixa de, digamos.
Todos esses números, e vou apenas fazer um cálculo aleatório, I vezes cinco.
Esta função, eu quero saber como ela funciona, quantos milissegundos leva para ser concluída, então como podemos
construir isso?
Primeiro, vou fazer algo sobre o qual não falamos ainda, que faremos algo
sobre módulos em módulos integrados, então, por enquanto, não vamos falar muito
sobre isso, mas vamos para importar do módulo de tempo algo chamado tempo duplo.
Novamente, algo sobre o qual falaremos na seção de módulos do curso, estou essencialmente dizendo,
ei, quando instalei o Python ou no meu caso quando estou usando este Reppel, ele tem acesso a esse tempo se eu
perguntar para isso.
E, neste caso, estou dizendo, ei, quero usar esse objeto ou módulo de tempo que recebo do Python.
E aqui vamos criar nosso decorador seguindo o padrão que aprendemos.
Vou dizer que definir desempenho e desempenho aceitará uma função exatamente como vimos antes.
E aqui teremos nosso invólucro.
Então, digamos função de invólucro e função de invólucro.
Se você se lembra, ele será flexível, levando em conta arcos estrela e arcos estrela estrela.
Para que possamos passar quantos parâmetros quisermos, pois não sabemos como essa função, quantos parâmetros ela vai
ter, e quero poder usar performance em todas as minhas funções.
Agora, aqui primeiro, o que vamos fazer é obter o resultado da função.
Seja o.
Função que recebemos aqui e então simplesmente dizemos.
Execute a função com estrela e estrela arcos de palavra-chave estrela.
E, finalmente, no final disso, desejo retornar os resultados.
E então, finalmente, vamos devolver o rapper, então nada que não vimos antes, eu poderia simplesmente ter feito o return
aqui ou apenas executar a função, mas vou mostrar por que fiz isso em um segundo .
No momento, nossa função realmente não faz nada.
Se eu clicar, corra.
Bem, nada acontece se eu fizer isso por muito tempo e executar esta função.
Só demorou muito para rodar, mas é só isso, nada acontece.
É quando tornamos as coisas interessantes.
Queremos calcular desde o início da execução desta função até o final da execução desta função.
E podemos usar o módulo de tempo para fazer isso.
Posso criar uma linha do tempo variável para o início e simplesmente dizer hora.
Portanto, estou executando esta função de tempo que vai iniciar.
Um tempo e diga, ei, este tempo inicial vai ser um.
E depois dessa função, nossa função principal, muito tempo passa, vou dizer T dois e dizer, ei, que
horas são?
Agora mesmo.
Desta vez, vamos verificar que horas são agora e então vamos executar essa função e, desta vez, vamos verificar
a hora e, por mais que haja diferença entre esses dois, é quanto tempo essa
parte demorou.
Direito.
Portanto, tudo o que fazemos é dizer imprimir uma string F e dizer que demorou T um menos T para.
Certo, e isso realmente retorna um milissegundo, então direi apenas armas quatro milissegundos.
E é isso.
Eu envolvi minha função apenas com este pedaço de tempo extra e então estou imprimindo assim que executarmos a função,
quanto tempo demorou.
Então, vamos dar uma olhada.
Se eu agora executar minha função de longa data aqui e clicar em executar.
Tudo bem, recebo um número negativo porque errei aqui.
Deve ser T dois menos T um, porque o tempo em T um passa algum tempo e depois dois.
Portanto, dois sempre será maior do que T um se eu executar isso.
Tudo bem, demorou um ponto, seis milissegundos, acho que na verdade são segundos.
Agora, vamos deixar essa função longa ainda mais longa se eu continuar assim e clicar em executar.
Oh, cara, isso levou um vírgula nove segundos.
E se eu prolongar ainda mais, se clicar em correr e esta é a parte em que continuo falando até que a função
seja executada, porque haverá um silêncio constrangedor, caso contrário, espero que acabe logo, porque não tenho
mais nada para falar.
Vamos, isso está ficando estranho.
Tudo bem.
Vamos.
Oh garoto.
Vou avançar rapidamente por aqui.
Oh, cara, demorou 19 segundos.
Isso é muito ruim.
Mas agora eu tenho esse decorador que posso fornecer para praticamente qualquer função em meu programa e realmente medir o desempenho de
minha função de forma bastante útil, certo?
Eu poderia ter este pedaço de código.
E antes, digamos, que eu implante meu código ou coloque meu código no mundo, posso testar o desempenho de minhas funções
e talvez possa otimizar as coisas de maneiras diferentes.
Muito, muito útil.
E fiz isso em apenas algumas linhas de código.
Nove linhas de código.
Agora, lembre-se, este decorador de desempenho depende da máquina e da velocidade da CPU e da memória
do computador.
Então, pelo que me levou 19 segundos, pode demorar muito mais ou muito menos dependendo da sua máquina.
Mas esta é uma boa maneira de comparar funções relativamente.
Espero que depois disso, você veja que o poder dos decoradores do decorador são muito usados em bibliotecas e
frameworks Python.
Frameworks da Web sobre os quais vamos falar, como Django e flask usam decoradores,
talvez você queira ter algum decorador de autenticação, então autentique onde cada função só pode ser executada.
Se o usuário for autenticado.
Talvez eles tenham o privilégio de executar uma função, como fazer login em um site.
Ou talvez você só precise de um registro ou registro.
Decorator que apenas registra e permite que seu banco de dados saiba que, ei, alguém se conectou ao seu sistema
ou, ei, alguém comprou algo da Amazon.
Ou, ei, alguém acabou de solicitar um pedido de amizade, há tantos usos para decoradores e decorador é um
assunto difícil.
Você não vai vê-los em todo o código Python.
Eles são apenas um recurso extra que você pode usar à medida que se familiariza com o Python.
Mas espero que, ao final deste corredor, você menos os compreenda para talvez um dia construir os seus
próprios ou usar os pré-construídos por bibliotecas e frameworks.
Te vejo no próximo.
Tchau.