// aula 03 · Python · POO

Criando Classes e
Objetos na Prática


📌

Objetivo desta aula

Sair da teoria e colocar a mão na massa: criar classes reais em Python, instanciar objetos, definir atributos e métodos, e entender como tudo se conecta dentro de um programa orientado a objetos.

Anatomia de uma classe em Python

Estrutura mínima de uma classe

Em Python, toda classe começa com a palavra-chave class seguida do nome (em PascalCase) e dois pontos. O método especial __init__ é o construtor — ele é chamado automaticamente toda vez que um objeto é criado.

class NomeDaClasse:                  # 1. Declaração da classe
    def __init__(self, param1, param2): # 2. Construtor
        self.atributo1 = param1          # 3. Atributos de instância
        self.atributo2 = param2

    def meu_metodo(self):               # 4. Métodos
        print(self.atributo1)

obj = NomeDaClasse("valor1", "valor2")  # 5. Instanciação
obj.meu_metodo()                          # 6. Chamada de método

O papel do self

self = "eu mesmo"

self é uma referência ao próprio objeto que está sendo criado ou usado. Quando você escreve self.cor, está dizendo: "o atributo cor deste objeto aqui". É obrigatório como primeiro parâmetro de todo método.

Atenção

self não é uma palavra reservada

Tecnicamente você poderia usar qualquer nome (ex: this, eu), mas self é a convenção universal do Python — nunca use outro nome. O interpretador passa o objeto automaticamente; você só precisa declarar o parâmetro.

obj.metodo()  → Python converte para
Classe.metodo(obj)

Criando sua primeira classe — passo a passo

01

Declare a classe com class

Use PascalCase para o nome. Uma classe simples pode começar apenas com pass (corpo vazio) — isso já é uma classe válida em Python.

02

Defina o construtor __init__

Aqui você recebe os dados iniciais e os guarda em self.atributo. Tudo que o objeto vai ter desde o nascimento fica aqui.

03

Adicione métodos (comportamentos)

Funções definidas dentro da classe. Sempre recebem self como primeiro argumento. Elas acessam e modificam os atributos do objeto via self.atributo.

04

Instancie o objeto

Fora da classe, chame o nome dela como se fosse uma função: meu_obj = MinhaClasse(args). Cada chamada cria um objeto independente na memória.

05

Acesse atributos e chame métodos

Use a notação de ponto: obj.atributo para ler, obj.atributo = valor para alterar, obj.metodo() para executar um comportamento.


Exemplo completo — classe Pessoa

Por que Pessoa?

É o exemplo mais intuitivo do Guanabara para entender como os atributos descrevem características reais e os métodos representam ações que uma pessoa pode fazer.

class Pessoa:
    def __init__(self, nome, idade, peso, altura):
        self.nome   = nome
        self.idade  = idade
        self.peso   = peso
        self.altura = altura

    def falar(self, msg):
        print(f"{self.nome} diz: '{msg}'")

    def imc(self):
        resultado = self.peso / (self.altura ** 2)
        print(f"IMC de {self.nome}: {resultado:.2f}")

    def aniversario(self):
        self.idade += 1
        print(f"{self.nome} agora tem {self.idade} anos!")

# Criando objetos
p1 = Pessoa("João",  22, 78.5, 1.80)
p2 = Pessoa("Maria", 30, 62.0, 1.65)

p1.falar("Olá, tudo bem?")  # → João diz: 'Olá, tudo bem?'
p2.imc()                   # → IMC de Maria: 22.77
p1.aniversario()            # → João agora tem 23 anos!

Visualizando as instâncias na memória

Classe: Pessoa
nomestr
idadeint
pesofloat
alturafloat
falar()
imc()
aniversario()
Objeto: p1
nome"João"
idade22
peso78.5
altura1.80
Objeto: p2
nome"Maria"
idade30
peso62.0
altura1.65

Cada objeto tem seus próprios valores

p1 e p2 compartilham a mesma estrutura (mesmos atributos e métodos) definida na classe, mas os valores são independentes. Mudar p1.idade não afeta p2.idade.


Atributo de classe vs. atributo de instância

De instância

Pertence ao objeto

Definido dentro do __init__ com self.atributo. Cada objeto tem o seu próprio valor, independente dos outros.

self.nome = nome
De classe

Compartilhado por todos

Definido diretamente no corpo da classe, fora do __init__. Todos os objetos daquela classe compartilham o mesmo valor.

especie = "Homo sapiens"
class Pessoa:
    especie = "Homo sapiens"   # atributo de CLASSE (compartilhado)

    def __init__(self, nome):
        self.nome = nome         # atributo de INSTÂNCIA (único por objeto)

p1 = Pessoa("Ana")
p2 = Pessoa("Beto")

print(p1.especie)    # → Homo sapiens
print(p2.especie)    # → Homo sapiens  (mesmo valor)
print(p1.nome)       # → Ana
print(p2.nome)       # → Beto           (valores diferentes!)

Métodos especiais — __str__ e representação do objeto

O que acontece quando você dá print(obj)?

Sem o método __str__, Python exibe algo como <__main__.Pessoa object at 0x7f3a> — um endereço de memória sem utilidade. Definindo __str__ você controla a mensagem exibida. É o método chamado automaticamente por print() e str().

class Pessoa:
    def __init__(self, nome, idade):
        self.nome  = nome
        self.idade = idade

    def __str__(self):            # chamado por print() e str()
        return f"Pessoa({self.nome}, {self.idade} anos)"

p = Pessoa("Lucas", 25)
print(p)   # → Pessoa(Lucas, 25 anos)

Erros comuns para evitar

Erro 1

Esquecer o self

Todo método precisa de self como primeiro parâmetro. Sem ele, Python lança TypeError ao chamar o método.

❌ def falar(msg)
✅ def falar(self, msg)
Erro 2

Atributo sem self

Se você escreve só nome = valor dentro de um método, cria uma variável local — não um atributo do objeto. Ela some ao fim do método.

❌ nome = "João"
✅ self.nome = "João"
Erro 3

Confundir classe e objeto

A classe é o molde; o objeto é o que foi criado. Chamar métodos na classe sem instanciar causa TypeError.

❌ Pessoa.falar("oi")
✅ p1.falar("oi")

Resumo — o que aprendemos

resumo — conceitos da aula 04
Conceito Palavra-chave / Sintaxe O que faz
Declarar classe class NomeClasse: Define o molde (tipo) para novos objetos
Construtor def __init__(self, ...): Inicializa os atributos ao criar o objeto
Atributo de instância self.nome = valor Dado único por objeto, definido no construtor
Atributo de classe atrib = valor (fora do init) Dado compartilhado por todos os objetos
Método def metodo(self): Comportamento/ação do objeto
Instanciar obj = Classe(args) Cria um objeto a partir da classe
Acessar atributo obj.atributo Lê o valor do atributo do objeto
Chamar método obj.metodo() Executa o comportamento do objeto
__str__ def __str__(self): Define como o objeto é exibido no print()
🧠

Dica de ouro do Guanabara

Antes de escrever qualquer código, pense: "O que meu objeto precisa TER (atributos) e o que ele precisa FAZER (métodos)?" Essa pergunta simples é o segredo para criar boas classes.