Orientação a Objetos em Python: classes e herança
Classes, instâncias, herança e polimorfismo explicados com exemplos do mundo real.
O que é Orientação a Objetos?
Orientação a Objetos (OO) é um paradigma de programação que organiza o código em torno de objetos. Um objeto combina dados (atributos) e comportamentos (métodos) em uma única estrutura. Em Python, quase tudo é um objeto: strings, listas, dicionários e até funções.
A OO resolve um problema prático: conforme o código cresce, funções soltas e variáveis globais ficam difíceis de manter. Classes agrupam tudo de forma organizada.
Classes e instâncias
Uma classe é um molde. Uma instância é um objeto criado a partir desse molde.
class ContaBancaria:
def __init__(self, titular, saldo=0):
self.titular = titular
self.saldo = saldo
def depositar(self, valor):
if valor <= 0:
print("O valor deve ser positivo.")
return
self.saldo += valor
print(f"Deposito de R${valor:.2f}. Saldo: R${self.saldo:.2f}")
def sacar(self, valor):
if valor > self.saldo:
print("Saldo insuficiente.")
return
self.saldo -= valor
print(f"Saque de R${valor:.2f}. Saldo: R${self.saldo:.2f}")
def extrato(self):
print(f"Titular: {self.titular} | Saldo: R${self.saldo:.2f}")
# Criando instancias
conta1 = ContaBancaria("Maria", 1000)
conta2 = ContaBancaria("Joao")
conta1.depositar(500) # Deposito de R$500.00. Saldo: R$1500.00
conta1.sacar(200) # Saque de R$200.00. Saldo: R$1300.00
conta2.extrato() # Titular: Joao | Saldo: R$0.00
O método __init__ é o construtor da classe. Ele é chamado automaticamente quando você cria uma nova instância. O parâmetro self representa a própria instância.
Encapsulamento
Encapsulamento é a prática de proteger os dados internos de um objeto. Em Python, usamos o prefixo _ para indicar atributos protegidos e __ para atributos privados:
class Usuario:
def __init__(self, nome, senha):
self.nome = nome
self.__senha = senha # atributo privado
def verificar_senha(self, tentativa):
return self.__senha == tentativa
def alterar_senha(self, senha_atual, nova_senha):
if self.verificar_senha(senha_atual):
self.__senha = nova_senha
print("Senha alterada com sucesso.")
else:
print("Senha atual incorreta.")
usuario = Usuario("Ana", "abc123")
print(usuario.nome) # Ana
print(usuario.verificar_senha("abc123")) # True
# print(usuario.__senha) # Erro! Atributo privado
Herança
Herança permite criar uma nova classe baseada em outra já existente. A classe filha herda todos os atributos e métodos da classe pai e pode adicionar ou sobrescrever comportamentos:
class ContaPoupanca(ContaBancaria):
def __init__(self, titular, saldo=0, taxa_rendimento=0.005):
super().__init__(titular, saldo)
self.taxa_rendimento = taxa_rendimento
def render(self):
rendimento = self.saldo * self.taxa_rendimento
self.saldo += rendimento
print(f"Rendimento: R${rendimento:.2f}. Saldo: R${self.saldo:.2f}")
class ContaCorrente(ContaBancaria):
def __init__(self, titular, saldo=0, limite=500):
super().__init__(titular, saldo)
self.limite = limite
def sacar(self, valor):
if valor > self.saldo + self.limite:
print("Saldo e limite insuficientes.")
return
self.saldo -= valor
print(f"Saque de R${valor:.2f}. Saldo: R${self.saldo:.2f}")
A função super() chama o método da classe pai. Assim, você reaproveita o código existente sem duplicar.
Polimorfismo
Polimorfismo significa que objetos de classes diferentes podem ser usados de forma intercambiável, desde que implementem os mesmos métodos:
def processar_contas(contas):
for conta in contas:
conta.extrato()
poupanca = ContaPoupanca("Maria", 5000)
corrente = ContaCorrente("Joao", 3000)
processar_contas([poupanca, corrente])
# Titular: Maria | Saldo: R$5000.00
# Titular: Joao | Saldo: R$3000.00
A função processar_contas não precisa saber se está lidando com uma ContaPoupança ou ContaCorrente. Basta que ambas tenham o método extrato.
Conclusão
Orientação a Objetos é um dos pilares do Python moderno. Classes organizam seu código, herança evita duplicação e polimorfismo torna o sistema flexível. Esses conceitos aparecem em frameworks como Flask e Django, ORMs como SQLAlchemy e praticamente toda biblioteca Python relevante. Pratique criando classes para problemas do seu dia a dia.