SENAI Goiás — Análise e Desenvolvimento de Sistemas

Programação Orientada a Objetos (Python)

1ª Verificação de Aprendizagem (VA) — Parte Prática

Como entregar: resolva as duas questões abaixo e envie dois arquivos: questao1.py e questao2.py. Cada arquivo deve conter a solução da questão correspondente e, no fim do arquivo, um pequeno trecho de teste que demonstre o funcionamento. Dica: rode seu código e compare com a saída esperada antes de entregar.

Questão 1 — Classe Produto

Conceitos: classes, encapsulamento (property/setter), validação com exceções, método e __str__.

Implemente, no arquivo questao1.py, uma classe Produto que represente um item de estoque, atendendo aos requisitos:

  • O construtor recebe nome, preco e quantidade.
  • Use @property e @setter para controlar preco e quantidade. Os setters não podem aceitar valores negativos: ao receber um valor negativo, devem levantar ValueError com mensagem clara.
  • Método valor_em_estoque() — retorna preco × quantidade.
  • Método vender(qtd) — reduz a quantidade; se qtd for maior que a disponível, levante ValueError.
  • __str__ — deve retornar algo no formato: Caneta — R$ 2.50 (15 em estoque).

Exemplo de teste (coloque no fim do arquivo):

p = Produto("Caneta", 2.50, 15)
print(p)
print("Valor em estoque:", p.valor_em_estoque())
p.vender(5)
print("Após vender 5:", p)
try:
    p.vender(100)
except ValueError as e:
    print("Erro:", e)

Saída esperada:

Caneta — R$ 2.50 (15 em estoque)
Valor em estoque: 37.5
Após vender 5: Caneta — R$ 2.50 (10 em estoque)
Erro: Estoque insuficiente: há 10, pedido 100

Questão 2 — Acervo de biblioteca

Conceitos: classe abstrata (ABC), herança, polimorfismo e exceção customizada.

Implemente, no arquivo questao2.py, um pequeno sistema de acervo de biblioteca, atendendo aos requisitos:

  • Crie uma classe abstrata ItemAcervo (módulo abc): construtor recebe titulo; método abstrato prazo_dias(); __str__ usando título e prazo.
  • Crie duas subclasses concretas: Livro (prazo 14 dias) e Revista (prazo 7 dias), cada uma implementando prazo_dias().
  • Crie uma exceção customizada ItemIndisponivelError.
  • Crie uma classe Acervo com: adicionar(item); listar() que percorre a lista e exibe cada item usando APENAS print(item) (a formatação vem do __str__ — polimorfismo); e emprestar(titulo) que localiza e remove o item, levantando ItemIndisponivelError se não existir.

Exemplo de teste (coloque no fim do arquivo):

acervo = Acervo()
acervo.adicionar(Livro("Python Fluente"))
acervo.adicionar(Revista("Veja"))
print("Acervo:")
acervo.listar()
emprestado = acervo.emprestar("Veja")
print("Emprestado:", emprestado)
print("Acervo após empréstimo:")
acervo.listar()
try:
    acervo.emprestar("O Hobbit")
except ItemIndisponivelError as e:
    print("Erro:", e)

Saída esperada:

Acervo:
Python Fluente (empréstimo: 14 dias)
Veja (empréstimo: 7 dias)
Emprestado: Veja (empréstimo: 7 dias)
Acervo após empréstimo:
Python Fluente (empréstimo: 14 dias)
Erro: Item 'O Hobbit' não está disponível no acervo