Насколько я понимаю, super() заключается в том, что, перефразируя, он обходит порядок разрешения методов класса и возвращает своего рода «диспетчер», при котором осуществляется доступ к методу или атрибуту. через __getattr__ получает доступ к «первая» реализация этого метода или атрибута, как того требует MRO.
Однако этот пример из RealPython меня сбил с толку. (Я добавил операторы печати и отредактировал их пример, удалив все функциональные методы, поскольку все, что меня здесь волнует, это то, как super() работает с MRO и различными __init__ методы.)
Код: Выделить всё
class Rectangle:
def __init__(self, length, width, **kwargs):
print("Running Rectangle.__init__")
self.length = length
self.width = width
super().__init__(**kwargs)
class Square(Rectangle):
def __init__(self, length, **kwargs):
print("Running Square.__init__")
super().__init__(length=length, width=length, **kwargs)
class Triangle:
def __init__(self, base, height, **kwargs):
print("Running Triangle.__init__")
self.base = base
self.height = height
super().__init__(**kwargs)
class RightPyramid(Square, Triangle):
def __init__(self, base, slant_height, **kwargs):
print("Running RightPyramid.__init__")
self.base = base
self.slant_height = slant_height
kwargs["height"] = slant_height
kwargs["length"] = base
super().__init__(base=base, **kwargs)
_ = RightPyramid(10, 5)
Код: Выделить всё
>>> super(RightPyramid).__init__
Подробнее здесь: [url]https://stackoverflow.com/questions/79227618/how-is-super-able-to-apparently-resolve-to-and-call-multiple-methods[/url]
Мобильная версия