Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Esclarecimento sobre classes abstratas

Olá, pelo que entendi, as classes abstratas são usadas para "forçar" a utilização dos métodos da Classe herdada, se não irá retornar erro. É isso mesmo?

No exemplo dado no tópico "Mãos na Massa" na criação do testeabc.py é criado o código abaixo para exemplificar o erro:

from collections.abc import MutableSequence

class MinhaListinhaMutavel(MutableSequence):
    pass

objetoValidado = MinhaListinhaMutavel()
print(objetoValidado)    

O erro vem a descrição:

TypeError: Can't instantiate abstract class MinhaListinhaMutavel with abstract methods __delitem__, __getitem__, __len__, __setitem__, insert

quer dizer que para não dar erro, teria que ser implementados todos os métodos citados no erro dentro da Classe MinhaListinhaMutavel ?

na prática eu não entendi por quê eu usaria esse MutableSequence. É pra obrigar a usar tudo isso mesmo? Em qual exemplo isso ocorreria?

Se a resposta para a questão acima é que foi só um exemplo, poderia colocar um exemplo de Classe que utiliza método abstrato como bloqueio, forçando a implementação do método herdado?

1 resposta
solução!

Olá Dailton, tudo bem com você?

Peço desculpas pela demora no retorno.

Quando fazemos o uso de uma classe abstrata no Python todas as classes filhas (que herdam) desta classe devem ter os métodos abstratos declarados na sua estrutura.

No exemplo apresentado na aula Mãos na massa para que não seja gerado o erro de tipo (TypeError) devemos implementar todos os métodos abstratos presentes na classe mãe MutableSequence. A documentação do Python disponibiliza uma lista de quais são esses métodos abstratos que devem ser implementados:

  • __getitem__
  • __setitem__
  • __delitem__
  • __len__
  • insert

Como exemplo prático, imagine que temos uma classe abstrata Conta e essa classe conta possui duas classes filhas Corrente e Poupanca, as classes filhas devem possuir os mesmos métodos presentes na classe mãe, sendo deposita, saca e extrato. Para que os métodos sejam de declaração obrigatória, vamos recorrer ao uso de classes abstratas, definindo assim a classe Conta como abstrata e seus métodos.

Exemplo de código de Classe Abstrata

from abc import ABCMeta, abstractmethod


class Conta(metaclass=ABCMeta):
    @abstractmethod
    def deposita(self):
        pass

    @abstractmethod
    def saca(self):
        pass

    @abstractmethod
    def extrato(self):
        pass


class Corrente(Conta):
    def deposita(self):
        print("Depositando na conta corrente")

    def saca(self):
        print("Sacando na conta corrente")


    def extrato(self):
        print("Extrato da conta corrente")


class Poupanca(Conta):

    def deposita(self):
        print("Depositando na conta poupança")

    def saca(self):
        print("Sacando na conta poupança")


    def extrato(self):
        print("Extrato da conta poupança")

No código acima temos uma representação simplificada das contas do tipo corrente e poupança que utilizamos no dia a dia, onde essas contas são uma derivação da classe mãe Conta que informa quais as opções (métodos) suas classes filhas devem possuir. E caso não fosse criado nas classe filhas os métodos da classe abstrata mãe, seria retornado TypeError, dizendo a obrigatoriedade de implementar todos os métodos da classe abstrata mãe.

Imagine uma classe abstrata como um contrato que não pode ser quebrado, quem assiná-lo, obrigatoriamente deverá cumprir.

Para aprimorar ainda mais o seu conhecimento sobre classes abstratas, recomendo a leitura do seguinte artigo, nele será apresentado como uma classe abstrata comporta em uma tentativa de instanciação e o erro gerado e como corrigi-lo. Fora isso, também indico a documentação do Python que evidencia quais são os métodos abstratos da classe MutableSequence:

O artigo acima está em inglês, caso tenha dificuldades com o idioma, recomendo o uso do tradutor do navegador.

Fico à disposição em caso de dúvidas.

Abraços e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!