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__recebemarcae armazena emself.marca.Carro.__init__recebemarcaemodelo, chamandosuper().__init__(marca).Carro.descricao()usasuper().descricao()e concatena o modelo.- Instancie um
Carroe imprimadescricao().
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
- Definimos
Veiculocom__init__que guardamarcaedescricao()que retorna uma string formatada. Carroherda deVeiculousandoclass Carro(Veiculo):.- No
__init__deCarro, chamamossuper().__init__(marca)para que a superclasse inicializeself.marca; depois guardamosself.modelo. - Sobrescrevemos
descricao(): chamamossuper().descricao()para obter o texto base e concatenamos" modelo {self.modelo}". - 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.marcanão existe edescricao()falha comAttributeError.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 geraTypeError. - Usar
Veiculo.descricao(self)em vez desuper(): 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