Guia de estudo

06/04/2026 · Aula 02

Classes e Objetos

em Python

Programação Orientada a Objetos com Python
Tecnologia em Análise e Desenvolvimento de Sistemas

4 horas Teoria + Prática Mão na massa

revisão

Lembra da dinâmica?

  • 🎁 A "coisa" que você trouxe: Isso é um objeto
  • 📋 Como ela é: Características → atributos
  • ⚙️ O que ela faz: Ações → métodos

Exemplos de Atributos

cor = "preto" marca = "Samsung" bateria = 80

Exemplos de Métodos

ligar() tirar_foto() carregar()

antes do código

Classes que você já conhece sem saber

📱

Celular

Atributos: marca, modelo, bateria, cor.
Métodos: ligar(), tirar_foto(), carregar().

🏦

Conta bancária

Atributos: titular, saldo, agência.
Métodos: depositar(), sacar(), extrato().

🎓

Aluno

Atributos: nome, matrícula, notas.
Métodos: adicionar_nota(), media(), situacao().

Toda vez que você pensar em um "conceito" que tem características e comportamentos, você tem uma classe em potencial.

conceito fundamental

Classe é um molde

Uma classe não é o objeto — é a descrição de como o objeto vai ser.

🏗️
Classe = projeto / molde / forma de bolo
🎂
Objeto = o bolo que saiu da forma (instância)
Você define a classe uma vez e cria quantos objetos quiser
conceito.py
# Classe = molde
class Cachorro:
    pass  # ainda vazio, mas já é uma classe!

# Objetos = instâncias do molde
rex  = Cachorro()
bolt = Cachorro()
rex e bolt são dois objetos diferentes criados a partir do mesmo molde.

fundamentos

O método __init__

__init__ é chamado automaticamente quando você cria um objeto. É onde você define os atributos iniciais.

cachorro.py
class Cachorro:
    def __init__(self, nome, raca, idade):
        self.nome  = nome   # atributo de instância
        self.raca  = raca
        self.idade = idade

rex  = Cachorro("Rex",  "Labrador", 3)
bolt = Cachorro("Bolt", "Husky",    1)

print(rex.nome)   # Rex
print(bolt.raca)  # Husky
self é a forma de Python dizer "este objeto específico". Sem self, os atributos não pertencem ao objeto.

entendendo o self

Por que self?

self é a referência ao próprio objeto. Python passa o objeto automaticamente como primeiro argumento em todo método.

❌ sem self

code.python
class Cachorro:
    def latir():  # falta self
        print("Au!")

rex = Cachorro()
rex.latir()  # ERRO!

✓ com self

code.python
class Cachorro:
    def latir(self):  # correto
        print("Au!")

rex = Cachorro()
rex.latir()  # Au!
Python converte rex.latir() em Cachorro.latir(rex) nos bastidores. O self é o rex.

fundamentos

Adicionando métodos

Métodos são funções que vivem dentro da classe e operam sobre os dados do objeto.

cachorro_completo.py
class Cachorro:
    def __init__(self, nome, idade):
        self.nome  = nome
        self.idade = idade

    def latir(self):
        print(f"{self.nome} diz: Au!")

    def apresentar(self):
        print(f"Meu nome é {self.nome} e tenho {self.idade} anos.")

rex = Cachorro("Rex", 3)
rex.latir()        # Rex diz: Au!
rex.apresentar()   # Meu nome é Rex e tenho 3 anos.

instâncias

Cada objeto é independente

Alterar um objeto não afeta os outros.

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

    def aniversario(self):
        self.idade += 1
        print(f"Feliz aniversário, {self.nome}! Agora tem {self.idade} anos.")

ana   = Pessoa("Ana",   22)
pedro = Pessoa("Pedro", 30)

ana.aniversario()   # Feliz aniversário, Ana! Agora tem 23 anos.
print(pedro.idade)  # 30 — Pedro não mudou

conectando com a aula 01

A calculadora vira uma classe

A calculadora que você fez na semana passada, agora com memória.

calculadora.py
class Calculadora:
    def __init__(self):
        self.historico = []   # atributo: guarda operações

    def somar(self, a, b):
        resultado = a + b
        self.historico.append(f"{a} + {b} = {resultado}")
        return resultado

    def ver_historico(self):
        for item in self.historico:
            print(item)

calc = Calculadora()
print(calc.somar(10, 5))
calc.ver_historico()
A calculadora agora tem memória — o atributo historico. Isso é impossível com funções avulsas.

atenção

Erros mais comuns de iniciantes

1

Esquecer o self no método

Todo método de instância precisa de self como primeiro parâmetro, sem exceção.

2

Não usar self. para acessar atributos

Dentro da classe, sempre self.nome, nunca só nome.

3

Esquecer de inicializar atributos no __init__

Todo atributo precisa ser criado no construtor. Usar self.notas sem ter feito self.notas = [] no construtor gera AttributeError.

4

Chamar método sem parênteses

obj.metodo() é correto, obj.metodo apenas cita o nome da função.

5

Confundir classe com objeto

Cachorro é a classe (molde), rex = Cachorro() é o objeto (instância).

exercício

Sistema de cadastro de alunos

Vamos criar uma classe Aluno do zero, juntos.

Parte 1 · base

Criar classe Aluno com nome, matricula e notas (lista vazia). Método exibir(self) que imprime o nome e a matrícula do aluno.

Parte 2 · métodos

Adicionar adicionar_nota(nota) e calcular_media() que retorna a média das notas.

Parte 3 · situação

Método situacao(): Aprovado (≥7), Recuperação (5–6.9) ou Reprovado (<5).

Trabalho individual. As três partes se complementam — tente chegar até a parte 3.

exercício · parte 1

Criando a classe Aluno

aluno.py
class Aluno:
    def __init__(self, nome, matricula):
        self.nome      = nome
        self.matricula = matricula
        self.notas     = []   # lista vazia

    def exibir(self):
        print(f"Aluno: {self.nome} | Matrícula: {self.matricula}")

# Teste
a1 = Aluno("Ana Silva", "2026001")
a1.exibir()

exercício · partes 2 e 3

Adicionando lógica

aluno_completo.py
class Aluno:
    def __init__(self, nome, matricula):
        self.nome      = nome
        self.matricula = matricula
        self.notas     = []

    def adicionar_nota(self, nota):
        self.notas.append(nota)

    def calcular_media(self):
        if len(self.notas) == 0:
            return 0
        return sum(self.notas) / len(self.notas)

    def situacao(self):
        media = self.calcular_media()
        if media >= 7:   return "Aprovado"
        elif media >= 5: return "Recuperação"
        else:             return "Reprovado"

    def exibir(self):
        media = self.calcular_media()
        situacao = self.situacao()
        print(f"Aluno: {self.nome} | Média: {media:.1f} | {situacao}")

a1 = Aluno("Ana Silva", "2026001")
a1.adicionar_nota(8.0)
a1.adicionar_nota(7.5)
a1.adicionar_nota(9.0)
a1.exibir()

dúvidas frequentes

Perguntas que todo mundo tem

?

Por que self aparece na definição mas não na chamada?

Python passa o objeto automaticamente. rex.latir() vira Cachorro.latir(rex) nos bastidores.

?

Qual a diferença entre Cachorro e Cachorro()?

Cachorro é a classe em si (o molde). Cachorro() chama o construtor e fabrica um objeto novo na memória.

?

Posso ter uma classe sem __init__?

Sim. Python usa um __init__ vazio padrão. Mas na prática, quase toda classe precisa de um para garantir que todo objeto nasça com seus dados.

?

Quando uso classe e quando uso só funções?

Se você tem dados que andam juntos e ações sobre esses dados, use classe. Se é apenas uma operação isolada sem estado, use função.

fechamento

O que vimos hoje

  • class NomeDaClasse: — como declarar a estrutura
  • __init__(self, ...) — o construtor onde nascem os atributos
  • self — a referência vital ao próprio objeto
  • Métodos de instância — funções que dão vida ao objeto
  • Independência — cada objeto tem seu próprio estado na memória

para casa

18 exercícios gradativos

Faça o máximo que conseguir e anote suas dúvidas para a próxima aula.

3

Fácil

Exercícios: 1 ao 3

básico
6

Médio

Exercícios: 4 ao 9

intermediário
5

Difícil

Exercícios: 10 ao 14

avançado
4

Avançado

Exercícios: 15 ao 18

desafio

exercícios para casa · nível fácil

Nível Fácil

01

Primeira classe — Carro

Crie uma classe Carro com atributos marca, modelo e ano. Adicione um método exibir(self) que imprime as informações do carro. Crie dois objetos diferentes e chame exibir() em ambos.

02

Classe Pessoa

Crie Pessoa com nome e idade. Adicione apresentar(self) que imprime uma saudação. Crie três instâncias com dados diferentes.

03

Classe Retângulo

Crie Retangulo com largura e altura. Adicione area(self) e perimetro(self) que retornam os respectivos valores.

exercícios para casa · nível médio

Nível Médio

04

Conta Bancária simples

Crie ContaBancaria com titular e saldo. Métodos depositar(valor) e sacar(valor) — saque só funciona com saldo suficiente. Adicione um método exibir(self) que imprime o titular e o saldo atual.

05

Classe Produto

Crie Produto com nome, preco e estoque. Métodos vender(qtd) — sem deixar negativo — e repor(qtd).

06

Classe Aluno (versão própria)

Sem olhar os slides — implemente do zero a classe Aluno com nome, matricula, lista de notas, adicionar_nota, calcular_media e situacao. Adicione um método exibir(self) que imprime o nome, a média e a situação do aluno.

07

Classe Cronômetro

Crie Cronometro com segundos = 0. Método avancar(s) soma segundos e em_minutos(self) retorna string como "2 minutos e 35 segundos".

08

Classe Temperatura

Crie Temperatura com atributo celsius. Métodos para_fahrenheit() e para_kelvin() que retornam os valores convertidos. Adicione um método exibir(self) que imprime as três escalas.

09

Calculadora com histórico

Implemente a Calculadora do slide 9. Adicione limpar_historico() e ultimo_resultado() que retorna o último item ou mensagem se vazio.

exercícios para casa · nível difícil

Nível Difícil

10

Classe Pilha (Stack)

Crie Pilha com lista vazia. Métodos empilhar(item), desempilhar() — retorna None se vazia —, topo() e esta_vazia(). Teste com 5 operações.

11

Classe Turma

Crie Turma com lista de alunos. Métodos matricular(aluno), listar(), media_turma() e melhores_alunos() — retorna quem tem média acima de 7. Use a classe Aluno do exercício 6.

12

Classe Agenda

Crie Agenda com dicionário de contatos. Métodos adicionar(nome, telefone), buscar(nome), remover(nome) e listar() em ordem alfabética.

13

Conta Bancária avançada

Expanda o exercício 4 adicionando extrato (lista), ver_extrato() com tipo e valor de cada operação e transferir(outra_conta, valor).

14

Classe Biblioteca

Crie Livro com titulo, autor e disponivel=True. Crie Biblioteca com adicionar_livro, emprestar, devolver e listar_disponiveis.

exercícios para casa · nível avançado

Nível Avançado

15

Classe Vetor2D

Crie Vetor2D com x e y. Implemente __str__, __add__ (soma de vetores), __eq__ e magnitude() — use import math.

16

Jogo de Adivinhação

Crie JogoAdivinhacao com número sorteado entre 1 e 100, contador de tentativas e máximo de 10. Métodos adivinhar(n) e reiniciar(). Use import random.

17

Classe Matriz

Crie Matriz com linhas e colunas (grade de zeros). Métodos definir(l,c,v), obter(l,c), __str__ formatado e somar(outra).

18

RPG — Personagem

Crie Personagem com vida=100, ataque e defesa. Método atacar(outro) — dano = max(0, ataque − defesa do outro) — e esta_vivo(). Simule um combate em loop.

próxima aula

Aula 3 · 08/04

Aula 03 · 08/04

Vamos aprofundar o uso de métodos, conhecer o __str__ em detalhes e aprender outras formas de representar um objeto.

métodos de instância __str__ e __repr__ métodos com retorno encadeamento de chamadas