1
resposta

super().__init__(nome)

Olá, estou com uma dúvida relacionada a herança de propriedades das classes.

Nesse Aula

Fizemos a seguinte herença :

class Funcionario:
def __init__(self, nome):
    self.nome = nome 
# restante do código

class Alura(Funcionario) :
  def mostrar_tarefas(self):
        print('Fez muita coisa, Alurete!')

  def busca_perguntas_sem_resposta(self):
        print('Mostrando perguntas não respondidas do fórum')

Aqui existe um herença certo ? Onde a classe Alura deveria receber todos atributos e metodos da classe Funcionario, como por exemplo o nome.

No entanto na Aula anterior, (se eu entendi direito), nos fizemos a mesma coisa, mas nos usamos o

super()__init__(nome)

Por exemplo :

class Programa:
  def __init__(self,nome, ano):
    self._nome = nome.title()
    self.ano = ano
    self._likes = 0 
# resto do código


class Filme(Programa):
  def __init__(self,nome, duracao, ano): #Aqui 
    super().__init__(nome, ano)
    self.duracao = duracao

Minha pergunta é qual a difereça ? quando nao usamos o super estamos dizendo " use todos atributos" e quando usamos ?

Obrigado pela atenção

Paris Mollo

1 resposta

Olá Paris! Como vai?

Ambos os códigos funcionam, mas tem objetivos diferentes.

Usamos o super() no segundo caso, porque adicionamos um método construtor com parâmetros, através do init e queremos indicar quais que vem da classe mãe (personalizamos quais parâmetros são exclusivos daquela subclasse - duracao - e quais vem direto da classe mãe - nome e ano).

O super() nos permite sobrescrever métodos e alterar comportamentos.

Quando precisamos importar parâmetros da classe mãe dentro de um método, usamos o super() para indicar o que queremos importar. Isso ocorre no seguinte trecho:

class Filme(Programa):
  def __init__(self,nome, duracao, ano): #Aqui 
    super().__init__(nome, ano)
    self.duracao = duracao

Aqui estamos importando o método init da classe mãe, e o sobrescrevendo para adicionar nosso self duração!

No caso do exercício da herança múltipla, o intuito é outro. Importamos tudo, sem nenhuma restrição. Fazemos isso pois não estamos usando nenhum método que precisa ser alterado para um comportamento específico da classe filha.

Se escrever ao final de seu código:

luan.registra_horas(3)

Verá que o método funciona mesmo sem o super, pois o importamos automaticamente. Isso ocorre por que luan pertence a uma classe que é filha da superclasse Funcionário.

Luan é objeto de Pleno, que por sua vez é filha de Alura, que é filha de Funcionários.

Perceba que não é o super() que causa a herança, e sim os seguintes trechos:

class Pleno(Alura, Caelum, Hipster):
    pass
class Alura(Funcionario):

Por favor, me avise se fez sentido. Qualquer dúvida estou à disposição.

Bons Estudos! =)