Programação orientada a objetos em Python: guia com exemplos

Aprenda programação orientada a objetos em Python na prática: classe e objeto, self, encapsulamento, herança e polimorfismo, com código que roda e os erros mais comuns de quem está começando.

Revisado pela equipe editorial ValorFinalDocumentação oficial do Python, Python.org e MDN Web Docs
Calcule agora: JSON FormatterResultado na hora, de graça e sem cadastro.

Programação orientada a objetos (POO) é o jeito de organizar um programa em torno de objetos, que juntam num só lugar os dados e as funções que mexem nesses dados. É o passo que separa quem escreve scripts curtos de quem consegue tocar um projeto maior sem se perder. Este guia mostra os quatro pilares na prática, com código Python que roda: classe e objeto, encapsulamento, herança e polimorfismo. Para estudar com playground no navegador, exercícios e certificado, use o curso de Python intermediário, gratuito.

Resposta rápida

  • Classe é o molde; objeto é a peça criada a partir dele.
  • __init__ monta o objeto; self é o próprio objeto dentro dos métodos.
  • Encapsulamento guarda os dados junto do comportamento que os altera.
  • Herança reaproveita uma classe; use só quando existe relação de é um.

De função solta a objeto

Imagine controlar uma conta bancária com variáveis soltas. O saldo fica numa variável, e você escreve funções separadas para depositar e sacar, passando o saldo toda hora. Com uma conta só já dá trabalho; com dez, o código vira um emaranhado de variáveis parecidas. A orientação a objetos resolve isso juntando o dado (o saldo) e o comportamento (depositar, sacar) numa mesma unidade.

class Conta:
    def __init__(self, dono, saldo=0):
        self.dono = dono
        self.saldo = saldo

    def depositar(self, valor):
        self.saldo += valor

    def sacar(self, valor):
        if valor > self.saldo:
            print("Saldo insuficiente")
        else:
            self.saldo -= valor

conta = Conta("Ana", 100)
conta.depositar(50)
conta.sacar(30)
print(conta.saldo)  # 120

A class Conta é o molde. O método __init__ roda quando você cria a conta e guarda os valores iniciais em self.dono e self.saldo. O self é o próprio objeto: é ele que permite a cada conta ter o seu saldo. A partir de um molde você cria quantos objetos quiser, cada um com seus dados.

Os quatro pilares, sem decoreba

A POO costuma ser resumida em quatro ideias. Não decore os nomes: entenda o problema que cada uma resolve.

PilarO que resolve
AbstraçãoEsconder o detalhe e expor só o que importa usar
EncapsulamentoManter dados e comportamento juntos, protegidos de mexida indevida
HerançaReaproveitar uma classe em outra parecida
PolimorfismoTratar objetos diferentes pela mesma interface

Encapsulamento: proteger o saldo

Repare que, no exemplo, alguém poderia escrever conta.saldo = -999 e furar a regra. Encapsular é impedir isso, oferecendo métodos que controlam o acesso. Em Python, um nome começado por um sublinhado sinaliza uso interno, e a propriedade permite validar antes de gravar:

class Conta:
    def __init__(self, saldo=0):
        self._saldo = saldo

    @property
    def saldo(self):
        return self._saldo

    def depositar(self, valor):
        if valor <= 0:
            raise ValueError("Valor deve ser positivo")
        self._saldo += valor

Agora o saldo só muda passando pelo depositar, que recusa valor negativo. Quem usa a classe não precisa saber como o saldo é guardado por dentro. Isso é abstração e encapsulamento trabalhando juntos.

Herança: reaproveitar sem copiar

Uma poupança é uma conta que rende. Em vez de reescrever depósito e saque, você herda de Conta e acrescenta o que muda:

class Poupanca(Conta):
    def render(self, taxa):
        self._saldo += self._saldo * taxa

p = Poupanca(1000)
p.depositar(200)
p.render(0.005)
print(p.saldo)  # 1206.0

A Poupanca ganha de graça tudo o que a Conta tem e adiciona o render. Use herança quando a frase é um faz sentido (poupança é uma conta). Quando a relação é tem um, como um carro que tem um motor, prefira composição: o objeto guarda outro objeto por dentro em vez de herdar dele.

Polimorfismo: mesma chamada, respostas diferentes

Polimorfismo é poder chamar o mesmo método em objetos de tipos diferentes e cada um responder do seu jeito. Se várias classes têm um método area(), um único laço percorre todas sem se importar com o tipo:

class Quadrado:
    def __init__(self, lado):
        self.lado = lado
    def area(self):
        return self.lado ** 2

class Circulo:
    def __init__(self, raio):
        self.raio = raio
    def area(self):
        return 3.14159 * self.raio ** 2

for figura in [Quadrado(4), Circulo(3)]:
    print(figura.area())

O laço não pergunta se a figura é quadrado ou círculo. Ele confia que cada uma sabe calcular a própria área. Adicionar um triângulo depois não exige mexer no laço, só criar a classe nova com o método area.

Erros comuns de quem está começando na POO

O curso de Python intermediário cobre classes, objetos, herança e polimorfismo com playground no navegador, exercícios corrigidos e certificado, sem custo. Se você ainda está no começo, comece pelo curso de Python do zero; para ir além, siga no curso de Python avançado.

Fontes

Conclusão

Orientação a objetos é agrupar dados e comportamento em classes e criar objetos a partir delas. Encapsule para proteger os dados, use herança só quando existe relação de é um e deixe o polimorfismo simplificar o código que trata muitos tipos. A melhor forma de fixar é escrever suas próprias classes e testar. Para praticar com playground, exercícios e certificado gratuitos, use o curso de Python intermediário e conheça todos os cursos gratuitos do ValorFinal.

Calculadoras deste guia

Fontes oficiais

Links externos para os documentos oficiais consultados na construção desta página. O conteúdo deles pode mudar sem aviso; em caso de divergência, vale sempre a fonte oficial.

Como validamos os cálculos

Os valores citados neste guia são estimativos e baseados em fontes oficiais (Documentação oficial do Python, Python.org e MDN Web Docs). Eles podem variar conforme convenção coletiva, situação individual e atualizações da legislação. Entenda nossa metodologia em como validamos os cálculos.

Perguntas frequentes

O que é programação orientada a objetos em poucas palavras?
É um jeito de organizar o programa em torno de objetos: pequenos pacotes que juntam dados e as funções que mexem nesses dados. Em vez de espalhar variáveis soltas e funções pelo código, você agrupa tudo o que pertence a uma mesma coisa. Um objeto Conta, por exemplo, guarda o saldo e sabe como depositar e sacar. Isso deixa programas maiores mais fáceis de entender e de mudar.
Qual a diferença entre classe e objeto?
A classe é o molde e o objeto é a peça feita a partir dele. A classe Cachorro descreve o que todo cachorro tem (nome, idade) e faz (latir). Cada cachorro concreto que você cria a partir dela é um objeto: o rex e o bob são dois objetos da mesma classe, cada um com seus próprios valores. Você escreve a classe uma vez e cria quantos objetos precisar.
O que é self em Python?
self é o próprio objeto, passado automaticamente para os métodos. Quando você escreve def depositar(self, valor), o self permite que o método leia e altere os dados daquele objeto específico, como self.saldo. Sem ele, o método não saberia de qual conta está falando. Você não passa self na chamada: o Python coloca ali sozinho o objeto antes do ponto.
Preciso usar orientação a objetos em todo programa Python?
Não. Scripts curtos, que só leem dados e fazem uma conta, ficam ótimos com funções simples. A orientação a objetos ganha valor quando o programa cresce e você percebe grupos de dados que sempre andam juntos e ganham comportamento próprio: um usuário, um pedido, um produto. Muitos programas misturam os dois estilos, e isso é normal.
O que é herança e quando usar?
Herança é quando uma classe aproveita o que outra já tem e acrescenta ou muda alguma coisa. Uma classe ContaPoupanca pode herdar de Conta e adicionar o cálculo de rendimento, sem reescrever depósito e saque. Use quando existe de fato uma relação do tipo é um (poupança é uma conta). Quando a relação é tem um, composição costuma ser melhor: um Carro tem um Motor, não herda de motor.
Onde pratico orientação a objetos em Python sem instalar nada?
Dá para rodar tudo no navegador. O curso de Python intermediário do ValorFinal tem um playground que executa o código na própria página, então você cria classes, objetos e herança e vê o resultado na hora, sem configurar ambiente. É a forma mais rápida de fixar cada conceito escrevendo e testando.