В Raymond Hettinger говорится: " Super считается супер говорить" в PyCon 2015 он объясняет преимущества использования super
в Python в контексте множественного наследования, Это один из примеров, которые использовал Раймонд во время его беседы:
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')
Кто-то в аудитории спросил Раймонда о разнице в использовании self.get_dough()
вместо super().get_dough()
. Я не очень хорошо понял краткий ответ Раймонда, но я закодировал две реализации этого примера, чтобы увидеть различия. Выходные данные одинаковы для обоих случаев:
Getting dough
Making pie with pure untreated wheat dough
Adding: Sausage
Adding: Mushroom
Если вы измените порядок классов от OrganicPizza(Pizza, OrganicDoughFactory)
до OrganicPizza(OrganicDoughFactory, Pizza)
с помощью self.get_dough()
, вы получите следующий результат:
Making pie with pure untreated wheat dough
Однако, если вы используете super().get_dough()
, это будет выход:
Making pie with insecticide treated wheat dough
Я понимаю поведение super()
, как объяснил Раймонд. Но каково ожидаемое поведение self
в сценарии множественного наследования?