// aula 03 · Python · POO
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
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 é 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.
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.
Criando sua primeira classe — passo a passo
classUse PascalCase para o nome. Uma classe simples pode começar apenas com pass (corpo vazio) — isso já é uma classe válida em Python.
__init__Aqui você recebe os dados iniciais e os guarda em self.atributo. Tudo que o objeto vai ter desde o nascimento fica aqui.
Funções definidas dentro da classe. Sempre recebem self como primeiro argumento. Elas acessam e modificam os atributos do objeto via self.atributo.
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.
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
É 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
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
Definido dentro do __init__ com self.atributo. Cada objeto tem o seu próprio valor, independente dos outros.
Definido diretamente no corpo da classe, fora do __init__. Todos os objetos daquela classe compartilham o mesmo valor.
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
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
selfTodo método precisa de self como primeiro parâmetro. Sem ele, Python lança TypeError ao chamar o método.
selfSe 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.
A classe é o molde; o objeto é o que foi criado. Chamar métodos na classe sem instanciar causa TypeError.
Resumo — o que aprendemos
| 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() |
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.