Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Необходимо ли использовать super?

#python #ооп #наследование


Объясните, пожалуйста, чем этот код

class ClassName(object):
    def __init__(self, arg):
        super(ClassName, self).__init__()
        self.arg = arg


по сути отличается от этого

class ClassName(object):
    def __init__(self, arg):
        object.__init__(self)
        self.arg = arg

    


Ответы

Ответ 1



May be usefull: Understanding Python super() and __init__() methods

Ответ 2



Различие этих двух блоков кода проявится тогда, когда они будут использоваться в цепочке наследований, например, class A1(object): def __init__(self): print('a1') super(A1, self).__init__() class A2(object): def __init__(self): print('a2') object.__init__(self) class B(object): def __init__(self): print('b') super(B, self).__init__() class C1(A1, B): def __init__(self): print('c1') super(C1, self).__init__() class C2(A2, B): def __init__(self): print('c2') super(C2, self).__init__() C1() print('-'*10) C2() В итоге будет следующий вывод: c1 a1 b ---------- c2 a2 Как можно заметить, в первом случае наследование разрешилось правильно, а в случае использования прямого вызова object.__init__(self) мы лишили себя возможности использования нашего класса (A2) в сложных цепочках наследования, так как класс B в нашем примере не был проинициализирован. Так что польза не столько в том, чтобы не изменять содержимое методов при изменении родительского класса, сколько в возможности корректного использования класса в наследовании.

Ответ 3



super() позволяет не писать класс-родитель. Он определяется динамически. PROFIT в том, что потом код будет легче менять - в случае изменения класса-родителя придется менять его в одном месте.

Ответ 4



Насколько понимаю, в данном отрывке кода только формальное - super все равно разрешится в тот же object. Однако конструкция с super все равно предпочтительней, потому что в этом случае класс-прослойка между object и ClassName будет легче добавляться. Ну и если память не изменяет, то super в 2.7 работает только в отнаследованных от object объектах, поэтому в коде можно будет встретить обе конструкции.

Комментариев нет:

Отправить комментарий