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:
- Reuso de código: a subclasse herda tudo que a superclasse já define, evitando duplicação.
- 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 atributonome
e um métodoemitir_som()
básico.Cachorro(Animal)
declara queCachorro
herda deAnimal
.- No construtor de
Cachorro
, usamossuper().__init__(nome)
para reutilizar a inicialização deAnimal
. - Em
Cachorro.emitir_som()
, sobrescrevemos o comportamento para algo específico de cães.