Поскольку порядок разрешения метода равен (__main__.C, __main__.A, __main__.B, object)
, можно ли вместо этого определить class B
следующим образом?
Нет, потому что тогда это не будет выполнено:
class D:
def __init__(self, d, **kwargs):
self.d = d
super().__init__(**kwargs)
class E(C, D):
def __init__(self, e, **kwargs):
self.e = e
super().__init__(**kwargs)
MRO E
равно (E, C, A, B, D, object)
, поэтому B
должен вызвать super().__init__
, иначе D.__init__
не будет вызвано.
Не super().__init__(**kwargs)
in class B
избыточно, поскольку любой излишек kwargs
, переданный в C
, будет передан в object
, повышая?
Нет, потому что излишек kwargs
будет go до D.__init__
в приведенном выше примере. Но даже без этого нет необходимости выдавать ошибку, когда вы вызываете конструктор со слишком большим количеством аргументов; Желательно иметь сообщение об ошибке, информирующее вас о неверном коде, а не об ошибке go незамеченной.
Является ли это защитой, если C
было определено как class C(B, A)
вместо class C(A, B)
?
В некотором смысле, конечно; но на самом деле это гарантия для B
, встречающаяся в любой иерархии классов, при условии, что другие классы в иерархии следуют тому же правилу вызова super().__init__(**kwargs)
.