Я изучаю множественное наследование класса
class A():
def __init__(self, a):
super().__init__()
self.a = a
class B():
def __init__(self, b):
super().__init__()
self.b = b
class C(A, B):
def __init__(self, a, b, c):
super().__init__(a, b)
self.c = c
C(1, 2, 3)
приводит к ошибке
TypeError: __init__() takes 2 positional arguments but 3 were given
Я хочу, чтобы он мог инициализироваться в порядке A-> B-> C, я все еще застреваю после поиска существующих связанных вопросов
Если вам нужно указать определенные аргументы для определенных суперклассов, вам нужно будет сделать это явно:
class A():
def __init__(self, a):
self.a = a
class B():
def __init__(self, b):
self.b = b
class C(A, B):
def __init__(self, a, b, c):
A.__init__(self, a)
B.__init__(self, b)
self.c = c
Обратите внимание, что вы также не можете больше выполнять super().__init__()
в классах A
и B
, потому что super
на самом деле вызывает не суперкласс класса, в котором он «записан», а следующий класс в порядке разрешения методов.
Обычно такой код указывает на плохой дизайн/неправильное использование подклассов.
Кроме того, вы можете обойти это, используя аргументы ключевого слова:
class A():
def __init__(self, *, a, **kwargs):
super().__init__(**kwargs)
self.a = a
class B():
def __init__(self, *, b, **kwargs):
super().__init__(**kwargs)
self.b = b
class C(A, B):
def __init__(self, a, b, c):
super().__init__(a=a, b=b)
self.c = c
Сделайте базовые классы более гибкими, заставив их передавать дополнительные *args
супервызову:
class A():
def __init__(self, a, *args):
super().__init__(*args)
self.a = a
class B():
def __init__(self, b, *args):
super().__init__(*args)
self.b = b
class C(A, B):
def __init__(self, a, b, c):
super().__init__(a, b)
self.c = c
>>> c = C(1,2,3)
>>> c.a
1
>>> c.b
2
>>> c.c
3
Было бы еще лучше использовать аргументы ключевого слова, чтобы не полагаться на mro:
class A():
def __init__(self, a=None, **kwargs):
super().__init__(**kwargs)
self.a = a
class B():
def __init__(self, b=None, **kwargs):
super().__init__(**kwargs)
self.b = b
class C(A, B):
def __init__(self, a, b, c):
super().__init__(a=a, b=b)
self.c = c
Теперь class C(B, A)
будет работать так, как ожидалось.