-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatributos.py
More file actions
189 lines (117 loc) · 4.89 KB
/
Copy pathatributos.py
File metadata and controls
189 lines (117 loc) · 4.89 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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
"""
POO - Atributos
Atributos -> Representam as características do objeto. Ou seja, pelos atributos
nós conseguimos representar computacionalmente os estados de um objeto.
Em Python, dividimos os atributos em 3 grupos:
- Atributos de Instância;
- Atributos de Classe;
- Atributos Dinâmicos;
# Atributos de instância: São atributos declarados dentro do método construtor.
# OBS: Método construtor: É um método especial utilizado para a construção do objeto.
# Em Java, uma classe Lâmpada, incluindo seus atributos ficaria mais ou menos:
public class Lampada(){
private int voltagem;
public String cor;
protected Boolean ligada = false;
public Lampada(int voltagem, String cor){
this.voltagem = voltagem;
this.cor = cor;
}
}
Em Python, por convenção, ficou estabelecido que, todo atributo de uma classe é público.
Ou seja, pode ser acessado em todo o projeto.
Caso queiramos demostrar que determinado atributo deve ser tratado como privado, ou seja,
que deve ser acessado/utilizado somente dentro da própria classe onde está declarado,
utiliza-se __ duplo underscore no início de seu nome.
Isso é conhecido também como Name Mangling.
# OBS: Lembre-se que isso é apenas uma convenção, ou seja, a linguagem Python não
# vai impedrir que façamos acesso aos atributos sinalizados como privados fora da classe.
# Exemplo
user = Acesso('user@gmail.com', '123456')
print(user.email)
# print(user.__senha) # AttributeError
print(user._Acesso__senha) # Temos acesso. Mas não deveríamos fazer este acesso. (Name Mangling)
user.mostra_senha()
user.mostra_email()
# O que significa atributos de instância?
# Significa, que ao criarmos instâncias/objetos de uma classe, todas as instâncias
# terão estes atributos.
user1 = Acesso('user1@gmail.com', '123456')
user2 = Acesso('user2@gmail.com', '654321')
user1.mostra_email()
user2.mostra_email()
# Atributos de Classe
# Atributos de classe, são atributos, claro, que são declarados diretamente na classe, ou seja,
# fora do contrutor. Geralmente já inicializamos um valor, e este valor é compartilhado entre
# todas as instâncias da classe. Ou seja, ao invés de cada instância da classe ter seus próprios
# valores como é o caso dos atributos de instância, com os atributos de classe todas as instâncias
# terão o mesmo valor para este atributo.
p1 = Produto('PlayStation 4', 'Video Game', 2300)
p2 = Produto('Xbox S', 'Video Game', 4500)
print(p1.valor) # Acesso possível, mas incorreto de um atributo de classe
print(p2.valor) # Acesso possível, mas incorreto de um atributo de classe
# OBS: Não precisamos criar uma instância de uma classe para fazer acesso a um atributo de classe
print(Produto.imposto) # Acesso correto de um atributo de classe
print(p1.id)
print(p2.id)
# OBS: Em linguagens como o Java, os atributos conhecidos como atributos de classe aqui em Python
# são chamados de atributos estáticos;
"""
# Classes com Atributo de Instância Público
class Lampada:
def __init__(self, voltagem, cor):
self.voltagem = voltagem
self.cor = cor
self.ligada = False
class ContaCorrente:
def __init__(self, numero, limite, saldo):
self.numero = numero
self.limite = limite
self.saldo = saldo
class Produto:
def __init__(self, nome, descricao, valor):
self.nome = nome
self.descricao = descricao
self.valor = valor
class Usuario:
def __init__(self, nome, email, senha):
self.nome = nome
self.email = email
self.senha = senha
# Atributos Públicos e Atributos Privados
class Acesso:
def __init__(self, email, senha):
self.email = email
self.__senha = senha
def mostra_senha(self):
print(self.__senha)
def mostra_email(self):
print(self.email)
# Refatorar a classe Produto
class Produto:
# Atributo de classe
imposto = 1.05 # 0.05% de imposto
contador = 0
def __init__(self, nome, descricao, valor):
self.id = Produto.contador + 1
self.nome = nome
self.descricao = descricao
self.valor = (valor * Produto.imposto)
Produto.contador = self.id
# Atributos Dinâmicos -> Um atributos de instância que pode ser criado em tempo de execução.
# OBS: O atributo dinâmico será exclusivo da instância que o criou.
p1 = Produto('PlayStation 4', 'Video Game', 2300)
p2 = Produto('Arroz', 'Mercearia', 5.99)
# Criando um atributo dinâmico em tempo de execução
p2.peso = '5kg' # Note que na classe Produto não existe o atributo peso
print(f'Produto: {p2.nome}, Descrição: {p2.descricao}, Valor: {p2.valor}, Peso: {p2.peso}')
# print(f'Produto: {p1.nome}, Descrição: {p1.descricao}, Valor: {p1.valor}, Peso: {p1.peso}')
# Deletando atributos
print(p1.__dict__)
print(p2.__dict__)
# print(Produto.__dict__)
del p2.peso
del p2.valor
del p2.descricao
print(p1.__dict__)
print(p2.__dict__)