Questão de Programação — Linguagens de programação — CESPE / CEBRASPE 2023
Programação›Linguagens de programação
Código
ce156121
Banca
CESPE / CEBRASPE
Órgão
MPE-RO
Ano
2023
Nível
Superior
Cargo
Analista Programador
Assinale a opção que apresenta o resultado correto do código Python precedente.
AErro de compilação
BErro de compilação método inexistente set_idade
C4021< class ' main_Pessoa ' >< class ' main.Estudante >
D4023< class ' main.Pessoa ' >< class ' main.Estudante Pos ' >
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.
1Cria objeto Estudante (idade=21, matricula=23)
2Imprime e.idade → 21
3Imprime e.matricula → 23
4Imprime type(e) → Estudante
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.