14.7 Exercício: Criando Nossa Sequência
-
Vá na pasta no curso e copie o arquivo contas.txt na pasta src do projeto banco que contém vários dados de contas correntes de clientes do banco.
-
Crie um arquivo chamado contas.py na pasta src do projeto banco . Crie uma classe chamada
Contas que herde da classe abstrata MutableSequence :
from collections.abc import MutableSequence class Contas(MutableSequence):
pass
- Vamos criar um atributo na classe chamado _dados do tipo list para armazenar nossas contas:
from collections.abc import MutableSequence class Contas(MutableSequence):
_dados = []
- Tente instanciar um objeto de tipo Contas :
if name ==' main ': contas = Contas()Note que não podemos instanciar este objeto. A interface MutableSequence nos obriga a implementar alguns métodos:
Traceback (most recent call last): File <stdin>, line 44, in <module>
contas = Contas()
TypeError: Can’t instantiate abstract class Contas with abstract methods delitem , getitem
, len , setitem , insert
- Implemente os métodos exigidos pela interface MutableSequence na classe Contas :
from collections.abc import MutableSequence class Contas(MutableSequence):
_dados = []
def len (self):
return len(self._dados)
def getitem (self, posicao): return self._dados[posicao]
def setitem (self, posicao, valor):
self._dados[posicao] = valor
def delitem (self, posicao): del self._dados[posicao]
python
def insert(self, posicao, valor):return self._dados.insert(posicao, valor)
Agora conseguimos instanciar nossa classe sem nenhum erro:
if name ==' main ': contas = Contas()- Nossa sequência só deve permitir adicionar elementos que sejam do tipo Conta . Vamos acrescentar
essa validação nos métodos setitem e insert . Caso o valor não seja uma Conta , vamos
lançar um TypeError com as devidas mensagens de erro:
def setitem (self, posicao, valor): if (isinstance(valor, Conta)):
self._dados[posicao] = valor else:
raise TypeError("valor atribuído não é uma Conta")
python
def insert(self, posicao, valor): if(isinstance(valor, Conta)):return self._dados.insert(posicao, valor) else:
raise TypeError('valor inserido não é uma Conta')
- Vamos iniciar a leitura dos dados do arquivo para armazenar em nosso objeto contas :
if name ==' main ': import csvcontas = Contas()
arquivo = open(‘contas.txt’, ‘r’) leitor = csv.reader(arquivo)
arquivo.close()
- Vamos criar uma laço for para ler cada linha do arquivo e construir um objeto do tipo
ContaCorrente .
if name ==' main ': import csv
python
from conta import ContaConrrete contas = Contas()arquivo = open(‘contas.txt’, ‘r’) leitor = csv.reader(arquivo)
for linha in leitor:conta = ContaCorrente(linha[0], linha[1], float(linha[2]), float(linha[3])) arquivo.close()
- Queremos inserir cada conta criada em nossa sequência mutável contas . Vamos pedir para que o programa acrescente cada conta criada em contas:
for linha in leitor:conta = ContaCorrente(linha[0], linha[1], float(linha[2]), float(linha[3])) contas.append(conta)
arquivo.close()
- Nossa classe Contas implementa MutableSequence . Isso quer dizer que ela é iterável já que
MutableSequence implementa o protocolo iter através do método getitem . Vamos
iterar através de uma laço for nosso objeto contas e pedir para imprimir o saldo e o valor do imposto de cada uma delas:
if name == ' main ': #código anterior omitidoarquivo.close() print(‘saldo - imposto’) for c in contas:
print(f'{} - {} {c.saldo, c.get_valor_imposto(}'))Que vai gerar a saída:
| saldo | - imposto |
| 1200.0 | - 12.0 |
| 2200.0 | - 22.0 |
| 1500.0 | - 15.0 |
| 5300.0 | - 53.0 |
| 7800.0 | - 78.0 |
| 1700.0 | - 17.0 |
| 2300.0 | - 23.0 |
| 8000.0 | - 80.0 |
| 4600.0 | - 46.0 |
| 9400.0 | - 94.0 |
-
(Opcional) Modifique o código do exercício anterior de modo que imprima o valor do saldo atualizado das contas.
-
(Opcional) Faça o mesmo com as contas poupanças. Crie um arquivo com extensão .csv com algumas contas poupanças, faça a leitura, construa os objetos e acrescente em uma estrutura de dados do tipo MutableSequence .
-
(Desafio Opcional) Refaça o exercício utilizando MutableMapping ao invés de
MutableSequence .
CAPÍTULO 15