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

Programação Orientada a Objetos (Python)

2ª Verificação de Aprendizagem (VA) — Parte Teórica

Instruções: são 10 questões de múltipla escolha. Cada questão tem um trecho de código Python — analise com calma e marque a alternativa que corresponde ao que o programa faz. Marque apenas uma alternativa por questão.

Questão 1 — Tratamento de exceções

O que este programa imprime?

def processar(a, b):
    try:
        print(a / b)
    except ZeroDivisionError:
        print("divisão por zero")
    else:
        print("deu certo")
    finally:
        print("fim")

processar(10, 0)
  • A) deu certo, depois fim
  • B) divisão por zero, depois deu certo, depois fim
  • C) Levanta ZeroDivisionError (traceback)
  • D) divisão por zero (só isso)
  • E) divisão por zero, depois fim

Questão 2 — Encapsulamento (property + ValueError)

O que acontece ao rodar este programa?

class Produto:
    def __init__(self, nome, preco):
        self.nome = nome
        self.preco = preco

    @property
    def preco(self):
        return self._preco

    @preco.setter
    def preco(self, valor):
        if valor < 0:
            raise ValueError("Preço não pode ser negativo")
        self._preco = valor

p = Produto("Ração", 50.0)
p.preco = 45.0
print(p.preco)
p.preco = -10
print(p.preco)
  • A) Imprime 50.0, depois 45.0, depois -10
  • B) Levanta ValueError já na criação, em Produto("Ração", 50.0)
  • C) Imprime 45.0 e depois levanta ValueError: Preço não pode ser negativo
  • D) Imprime 45.0 e depois -10 (o setter não bloqueia negativos)
  • E) Levanta AttributeError porque preco vira _preco

Questão 3 — Herança + super() + __str__

O que este programa imprime, nesta ordem?

class Veiculo:
    def __init__(self, marca):
        self.marca = marca

    def descrever(self):
        return f"Veículo {self.marca}"

    def __str__(self):
        return f"Veiculo({self.marca})"

class Carro(Veiculo):
    def __init__(self, marca, portas):
        super().__init__(marca)
        self.portas = portas

    def descrever(self):
        return f"{super().descrever()} com {self.portas} portas"

c = Carro("Fiat", 4)
print(c.descrever())
print(c)
  • A) Veículo Fiat com 4 portas, depois Veiculo(Fiat)
  • B) Veículo Fiat, depois Veiculo(Fiat)
  • C) Veículo Fiat com 4 portas, depois Carro(Fiat)
  • D) Levanta AttributeError porque Carro não define __str__
  • E) Veículo Fiat com 4 portas, depois <objeto Carro em 0x...>

Questão 4 — Exceção customizada

O que este programa imprime?

class EstoqueInsuficienteError(Exception):
    def __init__(self, pedido, disponivel):
        self.faltam = pedido - disponivel
        super().__init__(f"Faltam {self.faltam} unidades")

class Estoque:
    def __init__(self, disponivel):
        self.disponivel = disponivel

    def retirar(self, pedido):
        if pedido > self.disponivel:
            raise EstoqueInsuficienteError(pedido, self.disponivel)
        self.disponivel -= pedido

estoque = Estoque(5)
try:
    estoque.retirar(8)
except EstoqueInsuficienteError as erro:
    print("Erro:", erro)
    print("Faltam:", erro.faltam)
  • A) Erro: EstoqueInsuficienteError, depois Faltam: 3
  • B) Levanta EstoqueInsuficienteError (traceback); nada é impresso
  • C) Erro: Faltam 3 unidades, depois Faltam: 8
  • D) Erro: Faltam 3 unidades, depois Faltam: 3
  • E) Levanta AttributeError: 'EstoqueInsuficienteError' object has no attribute 'faltam'

Questão 5 — Classe abstrata (ABC) + polimorfismo

O que este programa imprime?

from abc import ABC, abstractmethod

class Animal(ABC):
    def __init__(self, nome):
        self.nome = nome

    @abstractmethod
    def falar(self):
        pass

class Cachorro(Animal):
    def falar(self):
        return "Au au"

class Gato(Animal):
    def falar(self):
        return "Miau"

animais = [Cachorro("Rex"), Gato("Mimi")]
for a in animais:
    print(f"{a.nome}: {a.falar()}")
  • A) Au au, depois Miau (sem os nomes)
  • B) Levanta TypeError: Can't instantiate abstract class Animal
  • C) Rex: Miau, depois Mimi: Au au
  • D) Rex: Au au, depois Mimi: Miau
  • E) Nada — falar() é abstrato e devolve None

Questão 6 — Coleções (sorted + key)

O que é impresso?

produtos = [("cafe", 18), ("leite", 5), ("pao", 8)]
ordenados = sorted(produtos, key=lambda p: p[1])
print(ordenados)
  • A) [('cafe', 18), ('leite', 5), ('pao', 8)]
  • B) [('cafe', 18), ('pao', 8), ('leite', 5)]
  • C) [('leite', 5), ('pao', 8), ('cafe', 18)]
  • D) None (sorted ordena no lugar e devolve None)
  • E) Levanta TypeError

Questão 7 — Persistência SQLite (from_row / to_params)

Rodando num banco loja.db recém-criado, o que este programa imprime?

import sqlite3

class Produto:
    def __init__(self, nome, preco, id=None):
        self.id = id
        self.nome = nome
        self.preco = preco

    @classmethod
    def from_row(cls, linha):
        id, nome, preco = linha
        return cls(nome, preco, id)

    def to_params(self):
        return (self.nome, self.preco)

    def __str__(self):
        return f"#{self.id} {self.nome} — R$ {self.preco:.2f}"

con = sqlite3.connect("loja.db")
con.execute("CREATE TABLE produtos (id INTEGER PRIMARY KEY AUTOINCREMENT, nome TEXT, preco REAL)")

cafe = Produto("Café", 18.0)
con.execute("INSERT INTO produtos (nome, preco) VALUES (?, ?)", cafe.to_params())

linha = con.execute("SELECT id, nome, preco FROM produtos").fetchone()
p = Produto.from_row(linha)
print(p)
  • A) #None Café — R$ 18.00
  • B) #1 Café — R$ 18.00
  • C) ('Café', 18.0)
  • D) #1 Café — R$ 18.0
  • E) Levanta sqlite3.IntegrityError

Questão 8 — Strategy

O que este programa imprime?

class Carrinho:
    def __init__(self, desconto):
        self.desconto = desconto
        self.itens = []

    def adicionar(self, preco):
        self.itens.append(preco)

    def total(self):
        subtotal = sum(self.itens)
        return self.desconto(subtotal)

def sem_desconto(v):
    return v

def black_friday(v):
    return v * 0.5

c = Carrinho(black_friday)
c.adicionar(100)
c.adicionar(60)
print(c.total())
  • A) 160
  • B) 80.0
  • C) 160.0
  • D) Levanta TypeError porque desconto é uma função
  • E) 50.0

Questão 9 — Tkinter — App(tk.Tk) + Listbox

O que este programa imprime?

import tkinter as tk

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.clientes = ["Ana", "Beto", "Carla"]
        self.lista = tk.Listbox(self)
        self.lista.pack()
        self.atualizar()

    def atualizar(self):
        self.lista.delete(0, tk.END)
        for c in self.clientes:
            self.lista.insert(tk.END, c)

    def remover(self, nome):
        self.clientes.remove(nome)
        self.atualizar()

app = App()
app.remover("Beto")
print(app.lista.get(1))
  • A) Carla
  • B) Ana
  • C) Beto
  • D) ('Ana', 'Carla')
  • E) Levanta IndexError

Questão 10 — SQLite (NOT NULL / IntegrityError)

Rodando num banco loja.db recém-criado, o que este programa imprime?

import sqlite3

con = sqlite3.connect("loja.db")
con.execute("CREATE TABLE itens (id INTEGER PRIMARY KEY, nome TEXT NOT NULL)")
try:
    con.execute("INSERT INTO itens (nome) VALUES (?)", (None,))
    print("inserido")
except sqlite3.IntegrityError:
    print("recusado pelo NOT NULL")
  • A) inserido
  • B) Levanta IntegrityError (traceback); nada é impresso
  • C) inserido, depois recusado pelo NOT NULL
  • D) Levanta OperationalError
  • E) recusado pelo NOT NULL