Questão nº 59
Questão de Tecnologia da Informação · FGV TRF1 2024 (nº 59)
Considere o seguinte código em Python:
```
class Orgao:
def __init__(self, s):
self.s = s
def print(self):
print(f"Nome: {self.s}")
def print2(self):
print("Nome:", self.sigla)
class Tribunal(Orgao):
def __init__(self, sigla):
super().__init__(sigla)
self.sigla = sigla
def print(self):
super().print()
trf1 = Tribunal("TRF1")
trf1.print()
trf1.print2()
```
Em relação às chamadas das funções trf1.print e trf1.print2 no
código acima, é correto afirmar que:
- Aambas as funções irão falhar;
- Bambas as funções serão executadas com sucesso; (alternativa correta)
- Cas funções não chegarão a ser chamadas, pois há erro de sintaxe;
- Dtrf1.print será executada com sucesso, mas trf1.print2 irá falhar;
- Etrf1.print2 será executada com sucesso, mas trf1.print irá falhar.
Resposta comentada
Gabarito Alternativa B
Em Python, quando uma classe herda de outra (subclasse de uma superclasse), os métodos da superclasse podem acessar atributos definidos na instância da subclasse, desde que esses atributos existam na instância. A resolução de atributos (self.atributo) ocorre no objeto em si, não na classe onde o método foi originalmente definido.
(A) Incorreta: Ambas as funções serão executadas sem falhas.
(B) Correta: Ambas as funções serão executadas com sucesso. Ao criar trf1 = Tribunal("TRF1"), o método Tribunal.__init__ é chamado. Ele primeiro chama super().__init__("TRF1"), que define self.s = "TRF1" na instância trf1. Em seguida, Tribunal.__init__ define self.sigla = "TRF1" na mesma instância. Assim, a instância trf1 possui ambos os atributos s e sigla, ambos com o valor "TRF1".
trf1.print(): Chama oprintdeTribunal, que por sua vez chamasuper().print(). Este é oprintdeOrgao, que acessaself.s. Comoself.sexiste ("TRF1"), ele imprime "Nome: TRF1".trf1.print2(): Chama oprint2deOrgao(poisTribunalnão o sobrescreve). Este método acessaself.sigla. Comoself.siglaexiste ("TRF1"), ele imprime "Nome: TRF1".
(C) Incorreta: Não há erros de sintaxe no código.
(D) Incorreta: Este é o distrator mais tentador. A armadilha aqui é pensar queOrgao.print2falharia porqueself.siglafoi definido apenas na subclasseTribunal. No entanto, em Python, os atributos são armazenados na instância (trf1). Se a instânciatrf1possui um atributosigla, qualquer método que a acesse (seja da superclasse ou subclasse) o encontrará. ComoTribunal.__init__defineself.sigla,trf1.siglaexiste etrf1.print2()não falha.
(E) Incorreta: Ambas as funções serão executadas com sucesso.
Fonte: FGV TRF1 2024 Técnico Judiciário - Desenvolvimento de Sistemas (Caderno Tipo 1). Reproduzida para fins de estudo.