Explorando Programação Orientada a Objetos com Python
Um guia prático sobre os pilares da POO em Python: classes, herança, polimorfismo e encapsulamento para projetos reais.
Por que POO importa?
Programação Orientada a Objetos não é apenas um paradigma acadêmico — é uma ferramenta prática para organizar código que cresce. Quando seu projeto passa de 500 linhas, a diferença entre código procedural e código bem estruturado com POO fica evidente.
Classes: o bloco fundamental
Em Python, tudo é objeto. Quando você cria uma classe, está definindo um novo tipo de dado com comportamentos específicos:
class Servico:
def __init__(self, nome: str, preco: float):
self.nome = nome
self.preco = preco
self._ativo = True
def desativar(self):
self._ativo = False
def esta_ativo(self) -> bool:
return self._ativo
Note o uso de _ativo com underscore — isso indica que o atributo é de uso interno. Python não impõe privacidade, mas respeitar essa convenção é fundamental.
Herança com propósito
Herança resolve um problema real: reutilizar comportamento sem duplicar código.
class ServicoRecorrente(Servico):
def __init__(self, nome: str, preco: float, frequencia: str):
super().__init__(nome, preco)
self.frequencia = frequencia
def calcular_custo_anual(self) -> float:
multiplicadores = {"mensal": 12, "trimestral": 4, "anual": 1}
return self.preco * multiplicadores.get(self.frequencia, 1)
Polimorfismo na prática
O poder do polimorfismo aparece quando diferentes objetos respondem à mesma interface:
def gerar_relatorio(servicos: list[Servico]) -> str:
linhas = []
for servico in servicos:
status = "Ativo" if servico.esta_ativo() else "Inativo"
linhas.append(f"{servico.nome}: {status}")
return "\n".join(linhas)
Não importa se o serviço é base ou recorrente — a função funciona para ambos.
Conclusão
POO em Python é pragmática. Use quando faz sentido, não por dogma. Para scripts simples, funções bastam. Para sistemas com múltiplas entidades e regras de negócio complexas, POO organiza e escala.
