Objetivos de aprendizagem
Ao final desta aula, você será capaz de:
- Criar e usar classes e objetos em Python.
- Identificar e aplicar atributos e métodos.
- Aplicar encapsulamento usando
_atributoe@property. - Organizar um projeto simples em múltiplos arquivos (módulos).
- Evoluir um programa de forma incremental com testes rápidos.
1) Estrutura do projeto (múltiplos arquivos)
Crie uma pasta chamada poo_jogo/ e monte esta estrutura:
BOX — DICA (organização)
Separar em arquivos deixa o projeto mais limpo:
personagem.pycuida do personageminventario.pycuida do inventáriomain.pyé onde você testa e executa
3) Conceitos essenciais (revisão rápida)
3.1 Atributos e métodos
- Atributo: guarda um valor (ex.: nome, vida).
- Método: executa uma ação (ex.: atacar, curar).
BOX — LEMBRETE
Atributo geralmente aparece comoobjeto.valor
Método aparece comoobjeto.acao()(tem parênteses).
3.2 Encapsulamento
Encapsular é controlar como o estado do objeto muda, evitando valores inválidos.
_atributo→ “protegido” por convenção (não mexa direto)@property→ forma “bonita” de permitir leitura (e às vezes escrita) com regras
BOX — ATENÇÃO
Em Python, encapsulamento é principalmente convenção + disciplina de código.
A ideia é: não altere diretamente aquilo que deve obedecer regras.
4) Implementação passo a passo (laboratório)
Passo 1 — Crie o arquivo inventario.py
Abra o arquivo inventario.py e cole:
BOX — DICA (o que encapsulamos aqui?)
A lista_itensé interna.
Você deve usaradicionar()eremover()para mexer nela.
Passo 2 — Crie o arquivo personagem.py
Agora abra personagem.py e cole:
BOX — ATENÇÃO (por que
@property?)
Com@property, você pode acessarvidacomo atributo:heroi.vida
mas a lógica de mudança fica protegida nos métodoscurar()ereceber_dano().
BOX — ERRO COMUM
Tentar mudar vida diretamente:heroi._vida = 999
Isso “fura” as regras. O correto é usar métodos:curar(),receber_dano().
Passo 3 — Crie o arquivo main.py (testes do laboratório)
Agora abra main.py e cole:
BOX — DICA (como executar)
No terminal, dentro da pastapoo_jogo/, rode:python main.py
5) Checkpoint de aprendizagem (para marcar no caderno)
Responda em 1–2 linhas cada:
- Onde estão os atributos do personagem?
- Cite 3 métodos do personagem e o que eles fazem.
- O que foi encapsulado no
Personagem? - Por que usamos
_vidae nãovidadiretamente? - O que o
Inventarioencapsula?
BOX — LEMBRETE
Encapsular = evitar alterações inválidas e manter regras em um único lugar.
6) Exercícios (para entregar)
Exercício 1 — Setter com validação (médio)
No arquivo personagem.py, crie um setter para vida usando:
@vida.setter
Regras do setter:
- se receber valor menor que 0 → definir 0
- se receber valor maior que vida_maxima → definir vida_maxima
- caso contrário → aceitar valor
BOX — ATENÇÃO
Mesmo com setter, priorize usarcurar()ereceber_dano()no restante do código.
Exercício 2 — Dano percentual (médio)
Crie em Personagem o método tomar_dano_percentual(porcentagem) que:
- calcula o dano como
vida_maxima * porcentagem / 100 - aplica o dano chamando
receber_dano(dano)
Teste no main.py com porcentagem 10, 25 e 50.
Exercício 3 — Equipar espada (médio)
No Personagem, crie:
- atributo
_arma(inicie comoNone) @property arma()para leitura- método
equipar_espada_curta()que:- verifica se o inventário tem
"Espada Curta" - se tiver, define
_arma = "Espada Curta"e retorna mensagem - se não tiver, retorna mensagem dizendo que não possui
- verifica se o inventário tem
Exercício 4 — Inventário com categorias (difícil)
No Inventario, em vez de guardar itens como strings simples, guarde como tuplas (nome, categoria).
Exemplo:
("Poção", "cura")("Espada Curta", "arma")
Atualize:
adicionar(nome, categoria)listar()para mostrarnome(categoria)tem_item(nome)para buscar pelo nome
Exercício 5 — Mini batalha automática (desafio)
No main.py, crie um loop de batalha:
- enquanto herói e inimigo estiverem vivos:
- herói ataca inimigo (dano fixo 12)
- se inimigo morrer, pare
- inimigo ataca herói (dano fixo 8)
- a cada rodada, imprima status dos dois
BOX — DICA (organização)
Faça uma funçãorodada(heroi, inimigo)para deixar omain.pymais limpo.
7) Extensão (opcional, para quem terminar cedo)
- Criar classe
Monstroseparada dePersonagem - Criar classe
Item(Poção, Espada) como objetos - Adicionar “defesa” e dano baseado em arma equipada
