14.7 Exercício: Criando Nossa Sequência

  1. 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.

  2. 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

  1. Vamos criar um atributo na classe chamado _dados do tipo list para armazenar nossas contas:

from collections.abc import MutableSequence class Contas(MutableSequence):

_dados = []

  1. 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

  1. 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()
  1. 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')
 
  1. Vamos iniciar a leitura dos dados do arquivo para armazenar em nosso objeto contas :
if name ==' main ': import csv

contas = Contas()

arquivo = open(‘contas.txt’, ‘r’) leitor = csv.reader(arquivo)

arquivo.close()

  1. 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()

  1. 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()

  1. 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 omitido

arquivo.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
  1. (Opcional) Modifique o código do exercício anterior de modo que imprima o valor do saldo atualizado das contas.

  2. (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 .

  3. (Desafio Opcional) Refaça o exercício utilizando MutableMapping ao invés de

MutableSequence .

CAPÍTULO 15‌‌


⬅️ Capítulo Anterior | Próximo Capítulo ➡️