Explique o que é herança em POO e como ela é implementada em Python. Dè um exemplo de uma classe Animal e uma classe Cachorro que herda de Animal, incluindo um método emitir_som() em ambas.

Passo 1

O enunciado pede para entendermos o conceito de herança em POO (Programação Orientada a Objetos) e vermos como implementá-la em Python. Vamos precisar explicar o que é herança, por que ela é útil e depois mostrar um exemplo concreto com uma classe base Animal e uma subclasse Cachorro que herda de Animal, ambas com um método emitir_som().

Passo 2

Herança em POO é um mecanismo que permite a uma classe (a subclasse) reutilizar atributos e métodos de outra classe (a superclasse ou classe base). Isso traz dois grandes benefícios:
  1. Reuso de código: a subclasse herda tudo que a superclasse já define, evitando duplicação.
  2. Especialização: a subclasse pode adicionar ou redefinir (sobrescrever) métodos e atributos para comportamentos específicos.

Passo 3

Em Python, a herança é implementada declarando a classe filha entre parênteses após o nome da classe. Por exemplo:
class Animal:
 # corpo da classe base
 ...
class Cachorro(Animal):
 # corpo da subclasse
 ...
Dentro da subclasse, você pode chamar o construtor da superclasse com super().__init__(...) se precisar herdar e inicializar atributos definidos em Animal.

Passo 4

Vamos definir ambas as classes com um método emitir_som(). Na superclasse Animal, esse método pode ser genérico ou até lançar uma exceção indicando que deve ser sobrescrito. Na subclasse Cachorro, vamos sobrescrever para imprimir “Au au!”.

Resposta

class Animal:
 def __init__(self, nome):
 # atributo comum a todos os animais
 self.nome = nome

 def \(emitir_som\)(self):
 # método genérico, que pode ser sobrescrito
 print(f"{self.nome} está em silêncio ou faz um som genérico.")


class Cachorro(Animal):
 def __init__(self, nome, raca):
 # chama o __init__ de Animal para inicializar o nome
 super().__init__(nome)
 # atributo específico de cachorro
 self.raca = raca

 def \(emitir_som\)(self):
 # sobrescrita do método da superclasse
 print(f"{self.nome} diz: Au au!")


# Exemplo de uso
if __name__ \(==\) "__main__":
 # instanciando um Animal genérico
 a = Animal("Bicho")
 a.\(emitir_som\)() # saída: Bicho está em silêncio ou faz um som genérico.

 # instanciando um Cachorro
 c = Cachorro("Rex", "Labrador")
 c.\(emitir_som\)() # saída: Rex diz: Au au!
Explicação rápida do código:
  • Animal define o atributo nome e um método emitir_som() básico.
  • Cachorro(Animal) declara que Cachorro herda de Animal.
  • No construtor de Cachorro, usamos super().__init__(nome) para reutilizar a inicialização de Animal.
  • Em Cachorro.emitir_som(), sobrescrevemos o comportamento para algo específico de cães.

Exercícios relacionados