Programador Leigo
POO 14 min leitura 05 FEV 2026

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.

Continue lendo

Compartilhar