Repository navigation
Expand file tree
/
Copy pathestudo_DECORATOR.py
More file actions
145 lines (90 loc) · 2.9 KB
/
Copy pathestudo_DECORATOR.py
File metadata and controls
145 lines (90 loc) · 2.9 KB
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
143
144
145
"""
........................DECORATOR - CONCEITO 1........................
Utilizado para alterar o comportamento de uma "FUNCAO" sem alterar o codigo da funcao internamente,
facilitando o reuso do codigo.
Muito utilizado no "Django" para testar login do user.
"""
"""
Criando DECORATOR UPPERCASE para alterar todas as FUNCOES (caso haja) e evitar erros.
"""
print("\n........................DECORATOR - CONCEITO 1........................\n")
class uppercase(object):
def __init__(self, funcao):
self.funcao = funcao
def __call__(self, *args):
self.funcao(args[0].upper())
"""
Para executar/utilizar o DECORATOR precisamos preceder o nome do DECORATOR pelo caracter "@" no inicio
da nossa FUNCAO.
"""
@uppercase
def nome(nome):
print("Nome: %s\n\n" % nome)
"""O decorator irá substituir esta linha abaixo."""
# print("Nome: %s" % nome.upper())
nome("Sandro")
print("Outro estudo de DECORATOR usando uma FUNCAO de divisao caso haja divisao por ZERO !\n")
def check(func):
def inside(a, b):
if b == 0:
print("Nao posso dividir por ZERO !")
return
func(a, b)
return inside
@check
def div(a, b):
return a / b
print(div(10, 0))
"""
........................DECORATOR - CONCEITO 2........................
É uma FUNCAO que tem outra FUNCAO como ARGUMENTO e retorna outra FUNCAO como Valor Retornável.
É uma FUNCAo de ALTO NIVEL que opera outra FUNCAO.
É sempre representada atraves da linha "@my_decorator" em cima de uma FUNCAO "def".
Exemplo:
3 funcoes (a, b, c):
Onde a funcao "a" recebe a funcao "b" como parametro para devolver como resposta a funcao "c".
def funcao_a_decorador(funcao_b):
def funcao_c_interna():
# código da funcao c interna
return funcao_c_interna
"""
print("\n........................DECORATOR - CONCEITO 2........................\n")
def soma():
print(15 + 20)
def subtracao():
print(30 - 10)
soma()
subtracao()
"""
Vamos acrescentar funcoes adicionais comuns a todas ou algumas das funcoes acima ("soma" e "subtracao")
usando "decoradores".
"""
print(
"\nVamos acrescentar funcoes adicionais comuns a todas ou algumas das funcoes acima (soma e "
"divisao) usando 'decoradores'.")
def funcao_decoradora(funcao_parametro):
def funcao_interior(*args, **kwargs): # "*args" é o mesmo que escrever "num1 + num2 + ..."
# Acoes adicionais que acrescentam (decoram).
print("Vamos realizar um cálculo: ")
funcao_parametro(*args, **kwargs)
# Acoes adicionais que acrescentam (decoram).
print("Terminamos o cálculo!")
return funcao_interior
@funcao_decoradora
def soma(num1, num2, num3):
print(num1 + num2 + num3)
def subtracao(num1, num2):
print(num1 - num2)
def multiplicacao(num1, num2):
print(num1 * num2)
@funcao_decoradora
def divisao(num1, num2):
print(num1 / num2)
@funcao_decoradora
def potencia(base, exponente):
print(pow(base, exponente))
soma(7, 5, 8)
subtracao(7, 5)
multiplicacao(7, 5)
divisao(7, 5)
potencia(5, 3)