Auto e super Python em herança múltipla
Na palestra de Raymond Hettinger "Super considerado super falar"na PyCon 2015, ele explica as vantagens de usarsuper
em Python no contexto de herança múltipla. Este é um dos exemplos que Raymond usou durante sua palestra:
class DoughFactory(object):
def get_dough(self):
return 'insecticide treated wheat dough'
class Pizza(DoughFactory):
def order_pizza(self, *toppings):
print('Getting dough')
dough = super().get_dough()
print('Making pie with %s' % dough)
for topping in toppings:
print('Adding: %s' % topping)
class OrganicDoughFactory(DoughFactory):
def get_dough(self):
return 'pure untreated wheat dough'
class OrganicPizza(Pizza, OrganicDoughFactory):
pass
if __name__ == '__main__':
OrganicPizza().order_pizza('Sausage', 'Mushroom')
Alguém na platéiaPerguntou Raymond sobre a diferença de usarself.get_dough()
em vez desuper().get_dough()
. Não entendi muito bem a breve resposta de Raymond, mas codifiquei as duas implementações deste exemplo para ver as diferenças. A saída é a mesma para os dois casos:
Getting dough
Making pie with pure untreated wheat dough
Adding: Sausage
Adding: Mushroom
Se você alterar a ordem da classe deOrganicPizza(Pizza, OrganicDoughFactory)
paraOrganicPizza(OrganicDoughFactory, Pizza)
usandoself.get_dough()
, você obterá este resultado:
Making pie with pure untreated wheat dough
No entanto, se você usarsuper().get_dough()
esta é a saída:
Making pie with insecticide treated wheat dough
Eu entendo osuper()
comportamento, como Raymond explicou. Mas qual é o comportamento esperado deself
no cenário de herança múltipla?