Herança e Polimorfismo em Python: Um Guia Detalhado

Python 30 de Jan de 2024

Texto de Paulo Clemente
Desenvolvedor na Rocketseat

Herança e polimorfismo são conceitos cruciais na programação orientada a objetos (POO) e para qualquer linguagem que permita esse paradigma. Este artigo fornece um guia detalhado, com uma análise passo a passo dos exemplos de código, para ajudar desenvolvedores a compreenderem melhor esses conceitos.

Durante o artigo usaremos Python nos exemplo, pois com sua sintaxe clara e estrutura intuitiva, torna o entendimento mais simples e direto.

NLW unite | Evento gratuito de programação na prática | Rocketseat
Desafie-se em uma nova tecnologia criando um projeto completo em 3 aulas no maior evento online e gratuito de programação na prática para todos os níveis da Rocketseat.

Herança em Python

A herança é um princípio da POO que permite a uma classe derivar propriedades e métodos de outra classe. Esta característica promove reusabilidade de código, facilita a manutenção e apoia a criação de uma hierarquia lógica entre objetos.

Exemplo de Herança: Classes Veiculo e Carro

Classe Base: Veiculo

class Veiculo:
    def __init__(self, marca, modelo):
        self.marca = marca
        self.modelo = modelo

    def mostrar_detalhes(self):
        print(f"Marca: {self.marca}, Modelo: {self.modelo}")

  1. Definição da Classe: class Veiculo: inicia a definição da classe Veiculo.
  2. Método Construtor __init__:
  • def __init__(self, marca, modelo): é o construtor da classe. self refere-se à instância da classe, marca e modelo são argumentos do construtor.
  • self.marca = marca; self.modelo = modelo: essas linhas atribuem os valores passados para as propriedades da instância.
  1. Método mostrar_detalhes:
  • Este método imprime os detalhes do veículo.

Classe Derivada: Carro

class Carro(Veiculo):
    def __init__(self, marca, modelo, portas):
        super().__init__(marca, modelo)
        self.portas = portas

  1. Herança: class Carro(Veiculo): indica que Carro é uma subclasse de Veiculo.
  2. Método Construtor com super():
  • super().__init__(marca, modelo): super() é usado para chamar o construtor da superclasse Veiculo. Isso garante que a inicialização da parte Veiculo de um Carro seja feita corretamente.
  • self.portas = portas: adiciona um novo atributo portas específico para a classe Carro.

Polimorfismo em Python

Polimorfismo permite que objetos de diferentes classes sejam tratados como objetos de uma classe comum.

NLW unite | Evento gratuito de programação na prática | Rocketseat
Desafie-se em uma nova tecnologia criando um projeto completo em 3 aulas no maior evento online e gratuito de programação na prática para todos os níveis da Rocketseat.

Exemplo de Polimorfismo: Classes Veiculo, Carro e Moto

Adicionando Classe Moto

class Moto(Veiculo):
    def __init__(self, marca, modelo, cilindradas):
        super().__init__(marca, modelo)
        self.cilindradas = cilindradas

  • Herança e Polimorfismo: Moto herda de Veiculo e tem um atributo adicional cilindradas. A função super().__init__(marca, modelo) chama o construtor da classe pai, e self.cilindradas = cilindradas adiciona um novo atributo.

Função Polimórfica

def mostrar_informacoes_veiculo(veiculo):
    veiculo.mostrar_detalhes()

  • Uso Polimórfico: Esta função aceita qualquer objeto que seja um Veiculo (ou uma subclasse de Veiculo) e chama seu método mostrar_detalhes. Isso demonstra polimorfismo, pois mostrar_detalhes pode comportar-se de maneira diferente dependendo da classe do objeto.

Testando com Carro e Moto

carro = Carro("Ford", "Fusion", 4)
moto = Moto("Honda", "CBR", 650)

mostrar_informacoes_veiculo(carro)
mostrar_informacoes_veiculo(moto)

  • Aqui, carro e moto são instâncias de Carro e Moto, respectivamente. Ambos são tratados pela mesma função mostrar_informacoes_veiculo, ilustrando polimorfismo.

Herança e polimorfismo são fundamentais na POO em Python e em qualquer linguagem que use esse paradigma, promovendo a reutilização de código e flexibilidade. A herança permite a extensão e a especialização de classes, enquanto o polimorfismo facilita a interação com objetos de diferentes classes de maneira unificada.

Marcadores