Я наследуюсь от двух классов и через метод super() пытаюсь из проинициализировать, но выдает ошибку. Почему?

class A:
    def __init__(self, value):
        self.value = value


class B:
    def __init__(self, name):
        self.name = name


class C(A, B):
    def __init__(self, name, value):
        super(A, self).__init__(value)
        super(B, self).__init__(name)


t = C('Name', 0)

Результаты:
Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2021.1.2\plugins\python-ce\helpers\pydev\pydevd.py", line 1483, in _exec
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2021.1.2\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/python/others/tests.py", line 17, in <module>
    t = C('Name', 0)
  File "C:/python/others/tests.py", line 14, in __init__
    super(B, self).__init__(name)
TypeError: object.__init__() takes exactly one argument (the instance to initialize)
python-BaseException

Process finished with exit code 1
  • Вопрос задан
  • 401 просмотр
Решения вопроса 1
@galaxy
class A:
    def __init__(self, value):
        print("A::__init__")
        self.value = value


class B:
    def __init__(self, name):
        print("B::__init__")
        self.name = name


class C(A, B):
    def __init__(self, name, value):
        super().__init__(value)
        super(A, self).__init__(name)

print(C.__mro__)
t = C('Name', 0)


При вызове super(Class, obj).method() ищется метод родительского класса, правее Class по цепочке mro:
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)


super() - в данном случае равносильно super(C, self) - поиск начнется с A
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы