Dominando Herança em Python: Conceitos, Sintaxe e Exemplos Práticos
Herança em Python
Herança permite criar nova classe que herda toda funcionalidade de classe pai enquanto adiciona ou estende recursos. Este tutorial explica como usar herança em Python, com exemplos claros e orientação de boas práticas.
Vídeo: Herança em Python
Herança em Python
Herança é princípio central de programação orientada a objetos que promove reuso de código e hierarquia lógica. Nova classe (a derivada ou filha) é definida com mudanças mínimas ou nenhuma em classe existente (a base ou pai). Classe filha recebe automaticamente atributos e métodos do pai, que podem ser sobrescritos ou estendidos conforme necessário.
Sintaxe de Herança em Python
class BaseClass:
# corpo da classe base
class DerivedClass(BaseClass):
# corpo da classe derivada
No snippet acima, DerivedClass herda todos membros públicos de BaseClass. Adicionando novos métodos ou sobrescrevendo existentes, classe derivada pode customizar comportamento enquanto reusa implementação base.
Exemplo de Herança em Python
Vamos ilustrar herança com exemplo prático. Suponha que temos classe genérica Polygon que armazena número de lados e seus comprimentos:
class Polygon:
def __init__(self, no_of_sides):
self.n = no_of_sides
self.sides = [0 for _ in range(no_of_sides)]
def input_sides(self):
self.sides = [float(input(f"Enter side {i+1} : ")) for i in range(self.n)]
def display_sides(self):
for i, side in enumerate(self.sides, 1):
print(f"Side {i} is {side}")
Classe Polygon encapsula atributos e métodos comuns para qualquer polígono. Um Triangle é polígono específico com exatamente três lados, então pode herdar de Polygon sem redefinir lógica compartilhada:
class Triangle(Polygon):
def __init__(self):
super().__init__(3) # inicializa base com 3 lados
def find_area(self):
a, b, c = self.sides
s = (a + b + c) / 2
area = (s * (s - a) * (s - b) * (s - c)) ** 0.5
print(f"The area of the triangle is {area:.2f}")
Executar o seguinte demonstra herança em ação:
>>> t = Triangle()
>>> t.input_sides()
Enter side 1 : 3
Enter side 2 : 5
Enter side 3 : 4
>>> t.display_sides()
Side 1 is 3.0
Side 2 is 5.0
Side 3 is 4.0
>>> t.find_area()
The area of the triangle is 6.00
Note que Triangle pode chamar input_sides() e display_sides() mesmo sem defini-las — herança torna esses métodos disponíveis automaticamente.
Se atributo ou método não encontrado na classe filha, Python busca na classe pai, e essa busca continua pela cadeia de herança se necessário.
Sobrescrita de Método em Python
Tanto Polygon quanto Triangle definem método __init__. Implementação da filha sobrescreve a do pai, mas pode (e deve) estender lógica base invocando-a explicitamente. Usar super() é abordagem moderna preferida:
class Triangle(Polygon):
def __init__(self):
super().__init__(3) # chama Polygon.__init__
Ao sobrescrever, método filho pode adicionar novo comportamento ou modificar comportamento base preservando funcionalidade original.
Python fornece isinstance() e issubclass() para introspectar relações de herança:
t = Triangle()
print(isinstance(t, Triangle)) # True
print(isinstance(t, Polygon)) # True
print(isinstance(t, int)) # False
print(isinstance(t, object)) # True
print(issubclass(Polygon, Triangle)) # False
print(issubclass(Triangle, Polygon)) # True
print(issubclass(bool, int)) # True
Esses utilitários são essenciais para type checking e garantir que objetos conformam interfaces esperadas.
Para mais sobre super(), veja documentação Python super() function.
python
- Dominando Tipos de Dados em Python: Guia Prático
- Dominando Operadores em Python: Guia Completo
- Dominando a Declaração Pass em Python: Guia Prático
- Dominando Dicionários em Python: Criação, Manipulação e Técnicas Avançadas
- Dominando Exceções Customizadas em Python: Guia Prático
- Dominando Programação Orientada a Objetos em Python: Classes, Herança, Encapsulamento e Polimorfismo
- Dominando Sobrecarga de Operadores em Python: Guia Prático
- Dominando Decorator @property do Python: Getters & Setters Limpos e Compatíveis
- Entendendo type() e isinstance() em Python: Exemplos Práticos
- Dominando Herança em C#: Construa Código Reutilizável e Manutenível