Куда бы я ни посмотрел, все продолжают говорить, какой классный super(). Но я склоняюсь к тому, чтобы не использовать super(), потому что это делает все намного сложнее, чем хотелось бы. Я видел несколько популярных примеров использования super(), но они никогда не показывают передачу позиционных обязательных аргументов в конструкторы базового класса.
Я знаю о проблеме с алмазами в Python, и super() предотвращает двойной вызов класса base_base. (в данном случае класс A)
Так ли уж плохо, что конструктор класса А вызывается дважды? (т. е. вариант 2)
Ниже приведен мой код для двух случаев.
Случай 1: Использование super()._ init _()
#abstractclass
class A(object):
#abstractmethod
def __init__(self, for_a, *args):
self.val_a = for_a
#abstractclass
class B(A):
#abstractmethod
def __init__(self, for_a, for_b, for_c):
super().__init__(for_a, for_c)
self.val_b = for_b
#abstractclass
class C(A):
#abstractmethod
def __init__(self, for_a, for_c):
super().__init__(for_a)
self.val_c = for_c
class D(B, C):
def __init__(self, for_a, for_b, for_c, for_d):
super().__init__(for_a, for_b, for_c)
self.val_d = for_d
class E(B):
def __init__(self, for_a, for_b, for_e, *args):
super().__init__(for_a, for_b, *args)
self.val_e = for_e
newobject1 = D(1, 2, 3, 4)
newobject2 = E(10, 11, 12, 0)
Вариант 2: статический — с использованием base._ init _(self)
#abstractclass
class A(object):
#abstractmethod
def __init__(self, for_a):
self.val_a = for_a
#abstractclass
class B(A):
#abstractmethod
def __init__(self, for_a, for_b):
A.__init__(self, for_a)
self.val_b = for_b
#abstractclass
class C(A):
#abstractmethod
def __init__(self, for_a, for_c):
A.__init__(self, for_a)
self.val_c = for_c
class D(B, C):
def __init__(self, for_a, for_b, for_c, for_d):
B.__init__(self, for_a, for_b)
C.__init__(self, for_a, for_c)
self.val_d = for_d
class E(B):
def __init__(self, for_a, for_b, for_e):
super().__init__(for_a, for_b)
self.val_e = for_e
newobject1 = D(1, 2, 3, 4)
newobject2 = E(10, 11, 12)
super
не является просто заменой статического вызова родительского базового класса. Я бы рекомендовал прочитать как Супер считается супер, так и Python Super хорош, но вы не можете использовать его, чтобы понять, как правильно его использовать . - person chepner   schedule 09.03.2016