Почему супервызов множественного наследования странный? [дубликат]Python

Программы на Python
Ответить
Anonymous
 Почему супервызов множественного наследования странный? [дубликат]

Сообщение Anonymous »

Предположим, у меня есть этот код:

Код: Выделить всё

class A:
def __init__(self, arg):
print(f"A called with: {arg}")

class B:
def __init__(self, arg):
print(f"B called with {arg}")

class C(A, B):
pass

C(1)
Я хочу получить результат:

Код: Выделить всё

A called with: 1
B called with: 1
Но когда я запускаю код (с версией 3.13.1 (tags/v3.13.1:0671451, 3 декабря 2024 г., 19:06:28) [MSC v.1942 64 бит (AMD64) )]) Я получаю результат:

Код: Выделить всё

A called with: 1
Чтобы получить желаемый результат, мне нужно сделать следующее:

Код: Выделить всё

class C(A, B):
def __init__(self, arg):
super().__init__(arg)
super(A, self).__init__(arg)
Я задаю вопрос: почему это не так:

Код: Выделить всё

class C(A, B):
def __init__(self, arg):
super(A, self).__init__(arg)
super(B, self).__init__(arg)
?
Какова причина: super(A, self) для вызова функции B class?
Обратите внимание, тоже пробовал это:

Код: Выделить всё

class C(A, B):
def __init__(self, arg):
super(C, self).__init__(arg)
И это не сработало.
Я также видел подобные методы (источник):

Код: Выделить всё

class First(object):
def __init__(self):
print "First(): entering"
super(First, self).__init__()
print "First(): exiting"

class Second(object):
def __init__(self):
print "Second(): entering"
super(Second, self).__init__()
print "Second(): exiting"

class Third(First, Second):
def __init__(self):
print "Third(): entering"
super(Third, self).__init__()
print "Third(): exiting"
Но когда я пытаюсь реализовать это в своем решении:

Код: Выделить всё

class A:
def __init__(self, arg):
super(A, self).__init__(arg)
print(f"A called with: {arg}")

class B:
def __init__(self, arg):
super(B, self).__init__(arg)
print(f"B called with {arg}")

class C(A, B):
def __init__(self, arg):
super(C, self).__init__(arg)
Я получаю:

Код: Выделить всё

Traceback (most recent call last):
File "censored\temp.py", line 15, in 
C(1)
~^^^
File "censored\temp.py", line 13, in __init__
super(C, self).__init__(arg)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^
File "censored\temp.py", line 3, in __init__
super(A, self).__init__(arg)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^
File "censored\temp.py", line 8, in __init__
super(B, self).__init__(arg)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^
TypeError: object.__init__() takes exactly one argument (the instance to initialize)
Когда я это сделаю:

Код: Выделить всё

class A:
def __init__(self, arg):
super(A, self).__init__(arg)
print(f"A called with: {arg}")

class B:
def __init__(self, arg):
print(f"B called with {arg}")

class C(A, B):
def __init__(self, arg):
super(C, self).__init__(arg)
(удален супервызов в B)
Он работает отлично, но, на мой взгляд, это настолько неправильное решение, что я предпочитаю этого вообще не делать .
Я просто хочу знать, в чем причина: super(A, self) для вызова функции класса B?
Заранее спасибо!


Подробнее здесь: https://stackoverflow.com/questions/793 ... e-is-wierd
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»