Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Duvida sobre @abstractmethod e metaclasse

Olá pessoal!

Fiquei com uma dúvida sobre o @abstractmethod. Na aula, é colocado o método passa_o_mes como um abstractmethod. Além disso, a classe conta é chamada de metaclass. Com isso, as classes que recebem a classe conta como herança ficam obrigadas a instanciar o método passa_o_mes para que rodem certinho ao criar objetos.

Primeira dúvida: O que é uma metaclass e para que geralmente é usada?

Segunda dúvida: Qual é a utilidade prática de criar a obrigatoriedade instanciar um método nas classes filhas que já está presente na classe mãe?

Abração pessoal!

5 respostas

Olá,

Alguém poderia me ajudar?

solução!

Olá Vitor.

De acordo com a documentação sobre datamodel, as metaclass podem ser usadas para criar para enum, logging, frameworks, mas seu potencial é ilimitado.

No exemplo do instrutor é utilizado o abc.ABCMeta que na documentação é descrito que ele implementa os métodos class.instancecheck e class.subclasscheck que são necessários para criar uma, Abstract Base Classes (ABCs), que é a base para uma classe abstrata. (Mais detalhes das ABCs podem ser encontrados na documentação sobre abc.

Na classe mãe, Conta, o método passa_mes não é implementando passando essa responsabilidade para as classes filhas que vão implementar ele de acordo com a sua regra de negocio, por exemplo:

Na ContaCorrente o calculo é feito retirando vinte por cento do saldo.

class ContaCorrente(Conta):
  def passa_mes(self):
    self.saldo -= self.saldo * .2

Já na ContaPoupanca o calculo é feito aumentando o saldo em vinte por cento.

class ContaPoupanca(Conta):
  def passa_mes(self):
    self.saldo += self.saldo * .2

Agora a utilidade utilizar o método abstrato que vai obrigar as classes filhas é que você garante que as classes filha terão esse método em comum e assim criar códigos que independem de qual das classes estamos recebendo.

O instrutor exemplifica isso criando um código com for que não sabe qual tipo de conta ele está recebendo, mas por termos o método abstract, garantimos que ele não vai chamar um método que não foi implementado.


contas = []
contas.append(ContaCorrente('Igor',100))
contas.append(ContaPoupanca('Cat',100))

for conta in contas:
  conta.deposita(0)
  print(conta)
  conta.passa_mes()
  print(conta)

Então basicamente um método abstract você passa a responsabilidade da implementação daquele método para quem herdar da sua classe e também garante que as classes filhas tenham os mesmo métodos da mãe.

Espero ter ajudado, mas qualquer duvida não hesite em perguntar e tambem recomendo a leitura desse artigo para reforçar conceitos de POO(programação orientada a objetos).

Bons Estudos.

Oi Vitor! Tudo bem?

** Segunda dúvida: Qual é a utilidade prática de criar a obrigatoriedade instanciar um método nas classes filhas que já está presente na classe mãe?

Usando o próprio exemplo da aula, pense que temos uma classe mãe que é a Classe Conta, de forma que atributos e metodos exatamente identicos possam ser herdados para variados tipos de conta, como Corrente, Poupança, investimento etc.. certo?

Pensando em um banco, todos os tipos de conta tem uma taxa, que tem que ser cobrada a cada mês. Porém os valores são diferentes, ou a data, ou até mesmo o nome.. Isso significa que não podemos definir um padrão igual para todas, certo? Então todas elas tem que ter o padrão definido dentro da própria classe. O que não pode é DEIXAR de ter.. por isso na classe mãe obrigamos que as filhas definam seus métodos, pra não ser possível criar uma conta de nenhum tipo que nao tenha dessa definição.

Acho que é mais ou menos isso ;)

Um abraço!!

Valeu Igor!! Obrigado pela explicação e pelas recomendações de leitura. Ainda to engatinhando e tendo um pouco de dificuldade com POO.

Taiane, acho que era justamente esse detalhe que eu não havia entendido, que, pelo que entendi agora, eu forço as classes filhas a instanciarem a classe abstrata. Muito obrigado!!

show! imagina!!