#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 объектах, поэтому в коде можно будет встретить обе конструкции.
Комментариев нет:
Отправить комментарий