Questão nº 46
Questão de Administração de Banco de Dados · FGV MPAL 2018 (nº 46)
Analise o código Python 2.7 a seguir.
class End_simples(object):
def __init__(self, rua, num, bai):
self.rua = rua
self.num = num
self.bai = bai
def Endereco(self):
return self.rua + ", " + self.num \
+ " " + self.bai
class End_com(End_simples):
def __init__(self, rua, num, bai, com):
End_simples.__init__(self,rua, num, bai)
self.com = com
def Endereco(self):
...
a = End_simples("Av Brasil", "243", \
"Floresta")
b = End_com("Av Miracema", "12", \
"Centro", "apto 3")
print(a.Endereco())
print(b.Endereco())
Sabe-se que a execução desse código produziu as duas linhas a seguir.
Av Brasil, 243 Floresta
Av Miracema, 12 Centro, apto 3
Assinale a opção que apresenta a correta definição para o método Endereco na classe End_com.
- A`return self.Endereco()+ ", " + self.com`
- B`return End_simples.Endereco() + ", " + self.com`
- C`return super(End_com, self).Endereco() + ", " + self.com` (alternativa correta)
- D`return parent(End_com, self).Endereco() + ", " + self.com`
- E`Return self.parent.Endereco() + ", " + self.com`
Resposta comentada
Gabarito Alternativa C
Herança é quando uma classe (filha) adquire características e comportamentos de outra classe (pai). Polimorfismo permite que métodos com o mesmo nome se comportem de maneiras diferentes em classes distintas, e para acessar a versão do método da classe pai, usamos a função super().
- (A) Incorreta: Chamar
self.Endereco()dentro do próprio métodoEnderecoda classeEnd_comcausaria uma recursão infinita, pois ele tentaria chamar a si mesmo repetidamente. Esta é a armadilha mais comum para iniciantes. - (B) Incorreta:
End_simples.Endereco()chama o método diretamente da classeEnd_simples. Para que funcionasse corretamente, você precisaria passar a instânciaselfexplicitamente como primeiro argumento (End_simples.Endereco(self)), mas mesmo assim, não é a forma mais robusta e recomendada em Python para lidar com herança e MRO (Method Resolution Order). - (C) Correta:
super(End_com, self).Endereco()é a forma padrão e recomendada em Python 2.7 para chamar um método da classe pai (ou da próxima classe na ordem de resolução de métodos) a partir de uma classe filha. Ele retorna um objeto proxy que permite acessar os métodos da classe pai, aplicando o polimorfismo corretamente e garantindo que o métodoEnderecoda classeEnd_simplesseja executado com a instância atual (self). - (D) Incorreta:
parentnão é uma função ou palavra-chave válida em Python para acessar a classe pai. Isso resultaria em um erro deNameError. - (E) Incorreta:
Returnestá com a primeira letra maiúscula, o que é um erro de sintaxe em Python (deve serreturn). Além disso,self.parentnão é um atributo padrão para acessar a classe pai; isso resultaria em umAttributeError.
Fonte: FGV MPAL 2018 Analista do Ministério Público - Administrador de Banco de Dados (Caderno Tipo 1). Reproduzida para fins de estudo.