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

Programação Orientada a Objetos (Python)

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

Instruções: esta parte contém 10 questões de múltipla escolha. Marque uma única alternativa por questão, assinalando o parêntese correspondente. Leia o enunciado e o código com atenção — algumas questões pedem para analisar a saída ou o comportamento do programa. A parte prática é entregue em arquivo separado.

Questão 1 · Representação de objetos (__str__)

Considere a classe a seguir:

class Ponto:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __str__(self):
        return f"({self.x}, {self.y})"

p = Ponto(2, 5)
print(p)
print(f"Ponto em {p}")

Assinale a alternativa correta sobre a saída do programa.

  • (   ) A) Imprime o endereço de memória do objeto nas duas linhas.
  • (   ) B) Imprime "(2, 5)" e depois "Ponto em (2, 5)": __str__ define a representação usada por print e por f-strings.
  • (   ) C) Ocorre erro: __str__ deve retornar None.
  • (   ) D) Imprime "(2, 5)" e depois "Ponto em <objeto Ponto>".
  • (   ) E) Imprime "Ponto(2, 5)" nas duas linhas.

Questão 2 · Parâmetros padrão mutáveis

Analise o programa em Python a seguir:

def add(item, lista=[]):
    lista.append(item)
    return lista

print(add(1))
print(add(2))

Assinale a alternativa que apresenta, na ordem, a saída produzida pelo programa.

  • (   ) A) [1] e depois [2]
  • (   ) B) [1, 2] e depois [1, 2]
  • (   ) C) [1] e depois [1, 2]
  • (   ) D) [] e depois []
  • (   ) E) O programa levanta um erro de execução.

Questão 3 · Classes abstratas — asserção-razão

Considere o código em Python:

from abc import ABC, abstractmethod

class Pagamento(ABC):
    @abstractmethod
    def processar(self, valor): ...

class Pix(Pagamento):
    def processar(self, valor):
        return f"Pix de R$ {valor}"

Avalie as asserções a seguir e a relação entre elas.

I. É possível criar objetos da classe Pix, mas não é possível instanciar Pagamento diretamente.

PORQUE

II. Pagamento é uma classe abstrata e Pix implementa o método abstrato processar(), tornando-se uma classe concreta.

A respeito dessas asserções, assinale a opção correta.

  • (   ) A) As asserções I e II são verdadeiras, e a II é uma justificativa correta da I.
  • (   ) B) As asserções I e II são verdadeiras, mas a II não é uma justificativa correta da I.
  • (   ) C) A asserção I é verdadeira, e a II é falsa.
  • (   ) D) A asserção I é falsa, e a II é verdadeira.
  • (   ) E) As asserções I e II são falsas.

Questão 4 · Encapsulamento — property com validação

Considere a classe a seguir, que controla a temperatura de um ambiente:

class Termostato:
    def __init__(self):
        self._temp = 20
    @property
    def temp(self):
        return self._temp
    @temp.setter
    def temp(self, valor):
        if valor < 10 or valor > 30:
            raise ValueError("Fora da faixa")
        self._temp = valor

t = Termostato()
t.temp = 25
print(t.temp)
t.temp = 40
print("fim")

Sobre a execução do programa, assinale a alternativa correta.

  • (   ) A) Imprime 25 e, em seguida, imprime "fim".
  • (   ) B) Levanta AttributeError já na linha t.temp = 25.
  • (   ) C) Imprime 20 e depois "fim".
  • (   ) D) Imprime 25, depois 40 e, por fim, "fim".
  • (   ) E) Imprime 25 e, em seguida, levanta ValueError; a linha que imprimiria "fim" não chega a ser executada.

Questão 5 · Tratamento de exceções — fluxo

Considere o programa:

def dividir(a, b):
    return a / b

try:
    r = dividir(10, 0)
except ZeroDivisionError:
    print("erro")
else:
    print("ok")
finally:
    print("fim")

Com base na semântica dos blocos try/except/else/finally, assinale a alternativa que apresenta, na ordem, a saída do programa.

  • (   ) A) ok / fim
  • (   ) B) erro
  • (   ) C) erro / ok / fim
  • (   ) D) erro / fim
  • (   ) E) fim

Questão 6 · Herança e sobrescrita

Considere as classes a seguir:

class Animal:
    def __init__(self, nome):
        self.nome = nome
    def falar(self):
        return "..."

class Cao(Animal):
    def falar(self):
        return "Au"

c = Cao("Rex")
print(c.nome, c.falar())

Assinale a alternativa correta.

  • (   ) A) Ocorre erro: Cao não define __init__, então não possui o atributo nome.
  • (   ) B) Imprime "Rex ...", pois falar() não foi de fato sobrescrito.
  • (   ) C) Imprime "Rex Au": Cao herda __init__ de Animal (que define self.nome) e sobrescreve falar().
  • (   ) D) Imprime "None Au".
  • (   ) E) Ocorre erro: um método herdado não pode ser sobrescrito.

Questão 7 · Encapsulamento — property e setter

Considere a classe a seguir:

class Avaliacao:
    def __init__(self):
        self._nota = 0
    @property
    def nota(self):
        return self._nota
    @nota.setter
    def nota(self, valor):
        self._nota = max(0, min(10, valor))

a = Avaliacao()
a.nota = 15
print(a.nota)
a.nota = -3
print(a.nota)

Assinale a alternativa que apresenta, na ordem, a saída do programa.

  • (   ) A) 15 / -3
  • (   ) B) 10 / 0
  • (   ) C) 0 / 0
  • (   ) D) Levanta ValueError nas duas atribuições.
  • (   ) E) 15 / 0

Questão 8 · Exceção customizada

Considere o código em Python:

class SaldoInsuficienteError(Exception):
    def __init__(self, saldo, valor):
        self.falta = valor - saldo
        super().__init__(f"Faltam R$ {self.falta:.2f}")

def sacar(saldo, valor):
    if valor > saldo:
        raise SaldoInsuficienteError(saldo, valor)
    return saldo - valor

try:
    sacar(100, 150)
except SaldoInsuficienteError as e:
    print("Erro:", e)
    print("Falta:", e.falta)

Assinale a alternativa que apresenta, na ordem, a saída do programa.

  • (   ) A) Erro: Faltam R$ 50.00 / Falta: 50
  • (   ) B) O programa falha: uma classe de exceção não pode definir __init__ próprio.
  • (   ) C) Erro: 150 / Falta: 100
  • (   ) D) O except não captura nada, pois SaldoInsuficienteError não herda corretamente de Exception.
  • (   ) E) Erro: Faltam R$ 50.00 — apenas uma linha; o atributo e.falta não existe.

Questão 9 · Hierarquia de exceções

Considere o trecho a seguir:

try:
    x = [1, 2, 3][10]
except LookupError:
    print("capturado")

Sabendo que IndexError é uma subclasse de LookupError, assinale a alternativa correta sobre o que o programa faz.

  • (   ) A) Nada é impresso: IndexError não é capturado por except LookupError e o programa termina com erro.
  • (   ) B) Imprime "capturado", porque IndexError é subclasse de LookupError e capturar a classe-mãe também trata as filhas.
  • (   ) C) Imprime "capturado", mas apenas porque [1, 2, 3][10] devolve None.
  • (   ) D) Levanta KeyError, pois índice fora do intervalo é tratado como KeyError.
  • (   ) E) Imprime "capturado" duas vezes.

Questão 10 · Polimorfismo (duck typing)

Considere o código a seguir:

class Pato:
    def som(self):
        return "Quack"

class Cao:
    def som(self):
        return "Au"

def coro(bichos):
    return [b.som() for b in bichos]

print(coro([Pato(), Cao()]))

Considerando o conceito de polimorfismo por duck typing, assinale a alternativa correta.

  • (   ) A) O código gera erro, pois Pato e Cao não herdam de uma superclasse comum.
  • (   ) B) Imprime ['som', 'som'].
  • (   ) C) Imprime ['Quack', 'Quack'].
  • (   ) D) Imprime ['Quack', 'Au']: coro funciona com qualquer objeto que possua o método som(), sem exigir herança comum.
  • (   ) E) Imprime ['Au', 'Quack'].