-
Notifications
You must be signed in to change notification settings - Fork 0
/
aula109_decorators.py
142 lines (84 loc) · 3.14 KB
/
aula109_decorators.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
Decoradores (Decorators)
O que são decorators?
- São funções;
- Envolvem outras funções e aprimoram os seus comportamentos;
- Decorators tem uma sitaxe própria usando "@". Não é obrigatório, mas é considerado Syntact Sugar.
-----------------------------------------
FUNCTION DECORATOR
-----------------------------------------
-----------------------------------------
-----------------------------------------
DECORATED FUNCTION
-----------------------------------------
-----------------------------------------
OBS: Pense em decorador como decorar uma casa. É como se a função comum fosse o quadro e a função decoradora
fosse a moldura do quadro. Ela tem o objetivo de conter a função comum dentro de si e melhorá-la em termos
de funcionalidade e comportamentos.
"""
# Exemplo 1 - Decorators como funções (Sintaxe não recomendada / Sem Syntax Sugar):
def seja_educado(funcao):
def sendo():
print('Foi um prazer conhecer você!')
funcao()
print('Tenha um ótimo dia!')
return sendo
def saudacao():
print('Seja bem vindo à Geek University')
# Testando 1:
teste = seja_educado(saudacao)
teste()
print('\n----- separando -----\n')
# Testando 2:
def raiva():
print('EU TE ODEIO!')
raiva_educada = seja_educado(raiva)
raiva_educada()
print('\n----- separando -----\n')
# Exemplo 2 - Decorators com Syntax Sugar (recomendado):
def seja_educado_mesmo(funcao):
def sendo_mesmo():
print('Foi um prazer conhecer você!')
funcao()
print('Tenha um excelente dia!')
return sendo_mesmo
@seja_educado_mesmo
def apresentando():
print('Meu nome é Pedro')
# Testando 1:
apresentando()
print('\n----- separando -----\n')
# Testando 2:
@seja_educado_mesmo
def dormir():
print('Quero dormir!')
dormir()
print('\n----- separando -----\n')
# Um exemplo para ser usado na Programação Web
"""
Imagine um site como o seguinte menu de cabeçalho:
+----------------+----------------+----------------+-------------------+
| Home | Serviços | Produtos | Adminstrativo |
+----------------+----------------+----------------+-------------------+
Você quer que o acesso do site se dê da seguinte forma:
https://www.suaempresa.com.br/home -> Acesso livre para qualquer usuário à pagina home
https://www.suaempresa.com.br/servicos -> Acesso livre para qualquer usuário à página serviços
https://www.suaempresa.com.br/produtos -> Acesso livre para qualquer usuário à página produtos
https://www.suaempresa.com.br/admin -> Acesso restrito somente para usuários logados
OBS: O exemplo abaixo não é um código funcional. É apenas um exemplo para elucidar como funcionaria:
def checa_login():
if not request.usuario:
redirect('https://www.suaempresa.com.br/login')
def checa_home(request):
return 'Pode acessar home'
def servicos(request):
return 'Pode acessar servicos'
def produtos(request):
return 'Pode acessar produtos'
@checa_login
def admin(request):
return 'Pode acessar admin'
"""
# OBS: Não confunda Decorator com Decorator Function!