Fácil Python

Herança simples com super()

Enunciado

Crie uma classe Veiculo com atributo marca e método descricao() que retorna "Veículo da marca X". Depois, crie Carro que herda de Veiculo, adiciona modelo e sobrescreve descricao() chamando super().descricao() e acrescentando " modelo Y".

Requisitos

  • Veiculo.__init__ recebe marca e armazena em self.marca.
  • Carro.__init__ recebe marca e modelo, chamando super().__init__(marca).
  • Carro.descricao() usa super().descricao() e concatena o modelo.
  • Instancie um Carro e imprima descricao().

Código inicial

class Veiculo:
    def __init__(self, marca):
        # complete
        pass

    def descricao(self):
        # complete
        pass

class Carro(Veiculo):
    def __init__(self, marca, modelo):
        # complete
        pass

    def descricao(self):
        # complete
        pass

# teste
c = Carro("Toyota", "Corolla")
print(c.descricao())

Saída esperada

Veículo da marca Toyota modelo Corolla
Ver dica

Use super().__init__(marca) para inicializar a parte herdada e super().descricao() para reaproveitar o texto da superclasse.

Mostrar solução
class Veiculo:
    def __init__(self, marca):
        self.marca = marca

    def descricao(self):
        return f"Veículo da marca {self.marca}"


class Carro(Veiculo):
    def __init__(self, marca, modelo):
        super().__init__(marca)  # inicializa a parte Veiculo
        self.modelo = modelo

    def descricao(self):
        # reaproveita a descrição da superclasse e adiciona o modelo
        return super().descricao() + f" modelo {self.modelo}"


if __name__ == "__main__":
    c = Carro("Toyota", "Corolla")
    print(c.descricao())

Passo a passo

  1. Definimos Veiculo com __init__ que guarda marca e descricao() que retorna uma string formatada.
  2. Carro herda de Veiculo usando class Carro(Veiculo):.
  3. No __init__ de Carro, chamamos super().__init__(marca) para que a superclasse inicialize self.marca; depois guardamos self.modelo.
  4. Sobrescrevemos descricao(): chamamos super().descricao() para obter o texto base e concatenamos " modelo {self.modelo}".
  5. No bloco principal, criamos Carro("Toyota", "Corolla") e imprimimos o resultado.

Por que funciona

A herança permite que Carro reutilize o código de Veiculo. O super() garante que a inicialização e a descrição da superclasse sejam executadas, evitando duplicar a lógica. Assim, se Veiculo.descricao() mudar, Carro continua consistente.

Erros comuns

  • Esquecer de chamar super().__init__(marca): self.marca não existe e descricao() falha com AttributeError.
    class Carro(Veiculo):
        def __init__(self, marca, modelo):
            self.modelo = modelo  # falta super().__init__
    
  • Chamar super().descricao() sem parênteses: retorna o método, não a string; o + com string gera TypeError.
  • Usar Veiculo.descricao(self) em vez de super(): funciona, mas quebra a MRO em herança múltipla.

Outra forma de resolver

Em vez de concatenar, poderíamos usar f"{super().descricao()} modelo {self.modelo}". É preferível quando há muitas partes variáveis, pois deixa a formatação mais legível.

Saída esperada

Veículo da marca Toyota modelo Corolla