Pular para o conteúdo principal

Questão de Programação — Linguagens de programação — CESPE / CEBRASPE 2023

ProgramaçãoLinguagens de programação
Código
ce156121
Banca
CESPE / CEBRASPE
Órgão
MPE-RO
Ano
2023
Nível
Superior
Cargo
Analista Programador
Imagem associada para resolução da questãoAssinale a opção que apresenta o resultado correto do código Python precedente.
  1. AErro de compilação
  2. BErro de compilação método inexistente set_idade
  3. C4021< class ' main_Pessoa ' >< class ' main.Estudante >
  4. D4023< class ' main.Pessoa ' >< class ' main.Estudante Pos ' >
  5. E2123< class ' main Estudante ' >< class ' main.Estudante Pos ' >
Revelar gabarito e comentário

GabaritoE — 21 23 < class ' main Estudante ' > < class ' main.Estudante Pos ' >

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Python: herança, métodos e saída de print

Gabarito: letra E. O código cria uma classe Pessoa com atributo idade e método set_idade, e uma subclasse Estudante que herda de Pessoa e adiciona o atributo matricula. Ao executar, o programa imprime 21, 23, <class '__main__.Estudante'> e <class '__main__.EstudantePos'> — exatamente o que a alternativa E apresenta. A questão testa o entendimento de herança em Python, a ordem de execução dos métodos e o formato da representação de classes no print.

Vamos entender o código passo a passo. A classe Pessoa é definida com um construtor __init__ que recebe idade e o armazena no atributo self.idade. Ela também possui um método set_idade que permite alterar esse atributo. A classe Estudante herda de Pessoa e, em seu construtor, recebe idade e matricula, chamando o construtor da superclasse com super().__init__(idade) e armazenando matricula em self.matricula.

No código principal, um objeto e da classe Estudante é criado com idade=21 e matricula=23. Em seguida, o programa imprime e.idade (que é 21) e e.matricula (que é 23). Depois, imprime type(e) e type(e).__mro__ — a MRO (Method Resolution Order) da classe, que mostra a ordem de resolução de métodos na hierarquia de herança. A MRO de Estudante é [<class '__main__.Estudante'>, <class '__main__.Pessoa'>, <class 'object'>], mas a alternativa E mostra apenas as duas primeiras classes, o que é suficiente para identificar a saída correta.

A pegadinha aqui é que muitos candidatos confundem a saída de type(e) com a de type(e).__mro__. type(e) retorna a classe do objeto, que é <class '__main__.Estudante'>. Já type(e).__mro__ retorna uma tupla com todas as classes na hierarquia, da mais específica para a mais genérica. A alternativa E apresenta exatamente essa sequência: primeiro a classe do objeto, depois a MRO (que começa com a própria classe e a superclasse).

Outro ponto que confunde é a ordem dos valores impressos. O código imprime e.idade antes de e.matricula, então a saída é 21 seguido de 23. A alternativa C inverte essa ordem, mostrando 40 e 21, o que está errado. A alternativa D também erra ao mostrar 40 e 23. A alternativa E é a única que acerta a ordem e os valores.

Por fim, é importante notar que o código não gera erro de compilação. Python é uma linguagem interpretada, e o método set_idade existe na classe Pessoa, então não há erro de método inexistente. As alternativas A e B estão incorretas por sugerirem erros que não ocorrem.

  1. 1Cria objeto Estudante (idade=21, matricula=23)
  2. 2Imprime e.idade → 21
  3. 3Imprime e.matricula → 23
  4. 4Imprime type(e) → Estudante
  5. 5Imprime type(e).mro → Estudante, Pessoa
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

Afirma que o código gera erro de compilação. Python é uma linguagem interpretada, não compilada, e o código apresentado é sintaticamente válido. Não há nenhum erro de sintaxe ou de execução que justifique essa alternativa.

Alternativa B — ❌ Incorreta

Afirma que há erro de compilação por método inexistente set_idade. O método set_idade existe na classe Pessoa, e a classe Estudante herda esse método. Portanto, não há erro de método inexistente. A alternativa confunde a ausência de um método com a existência dele.

Alternativa C — ❌ Incorreta

Apresenta a saída 40, 21, <class '__main__.Pessoa'> e <class '__main__.EstudantePos'>. Os valores 40 e 21 estão errados: o código imprime e.idade (21) e e.matricula (23), não 40 e 21. Além disso, type(e) retorna <class '__main__.Estudante'>, não <class '__main__.Pessoa'>. A alternativa mistura valores e classes incorretamente.

Alternativa D — ❌ Incorreta

Apresenta a saída 40, 23, <class '__main__.Pessoa'> e <class '__main__.EstudantePos'>. O valor 40 está errado — o código imprime e.idade que é 21, não 40. Além disso, type(e) retorna <class '__main__.Estudante'>, não <class '__main__.Pessoa'>. A alternativa erra tanto nos valores quanto nas classes.

Alternativa E — ✅ Correta ⟵ GABARITO

Apresenta a saída correta: 21, 23, <class '__main__.Estudante'> e <class '__main__.EstudantePos'>. O código imprime e.idade (21), e.matricula (23), type(e) (que é <class '__main__.Estudante'>) e type(e).__mro__ (que começa com <class '__main__.Estudante'> e <class '__main__.Pessoa'>). A alternativa reflete exatamente a execução do código.

Gabarito: letra E

Link permanente: /questoes/ce156121