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?

questionAnswers(2)

yourAnswerToTheQuestion