Немного смущен вызовом super () - PullRequest
1 голос
/ 02 февраля 2020

Начиная с https://realpython.com/python-super/, приводится пример того, как super () используется для инициализации родительского класса. Пример кода:

class Rectangle:
def __init__(self, length, width):
    self.length = length
    self.width = width

def area(self):
    return self.length * self.width

def perimeter(self):
    return 2 * self.length + 2 * self.width

class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

super() для вызова __init__() класса Rectangle, что позволяет использовать его в классе Square без повторения кода.

Хотя, если я определю класс Square следующим образом:

class Square(Rectangle):
    pass

Я могу использовать весь родительский метод, создав объект:

square = Square(4,4)

Вызов square.area выдает 16, как и ожидалось.

В книге Python 3 объектно-ориентированного программирования П. Дасти, объяснение лучше (стр.71):

[... ] для суперкласса можно go неинициализироваться, если мы пренебрегаем явным вызовом инициализатора.

В случае множественного наследования от одного родительского класса автор упоминает, что:

возможность многократного вызова суперкласса из-за организации иерархии классов

Я понимаю последний момент, который объясняется на примере, показывающем, что идентичное имя метода можно назвать множественным раз в случае множественного наследования. Однако в случае простого наследования можно задаться вопросом, действительно ли это вызовет проблемы. Кроме того, я не вижу, как родительский класс не мог быть инициализирован ...

1 Ответ

1 голос
/ 02 февраля 2020

Если у вас есть:

class Square(Rectangle):
    pass

, то Square.__init__ разрешится до Rectangle.__init__, поскольку Square не переопределяет его. Вы должны вызывать класс super только тогда, когда вы переопределяете указанный метод c и хотите вызвать его для базового класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...