Проблема множественного наследования с super () - PullRequest
0 голосов
/ 12 апреля 2020

У меня проблема с множественным наследованием, которую я не могу понять. Вот очень обобщенный минимальный пример, который воспроизводит мою ошибку (мой код намного сложнее, чем этот).

class Thing(object):
    def __init__(self, x=None):
        self.x = x

class Mixin(object):
    def __init__(self):
        self.numbers = [1,2,3]

    def children(self):
        return [super().__init__(x=num) for num in self.numbers]

class CompositeThing(Mixin, Thing):
    def __init__(self):
        super().__init__()

    def test(self):
        for child in self.children():
            print(child.x)

obj = CompositeThing()
obj.test()

За это , я ожидаю, что метод children() вернет список Thing, созданный из self.numbers. Вместо этого я получаю TypeError: super(type, obj): obj must be an instance or subtype of type. Кстати, то же самое происходит, если я не вызываю конструктор и не разрешаю детям возвращать super() 3 раза (т. Е. Необоснованный суперкласс). Есть идеи, почему это может происходить?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

На самом деле, я понял это. Было две проблемы: (1) super() не работает должным образом в пределах понимания , потому что понимание в Py3 имеет свою область действия - это вызвало TypeError, которое я испытывал. (2) То, что я действительно пытался сделать, это создать новый экземпляр родительского вместо вызова метода из родительского объекта. Я написал новый вопрос только для последней проблемы для ясности.

0 голосов
/ 12 апреля 2020

В строке 9 вашего кода похоже, что вы пытаетесь вызвать __init__ из object. Я предполагаю, что вы имели в виду Mixin наследовать от Thing.

class Thing(object):
    def __init__(self, x=None):
        self.x = x

class Mixin(Thing):
    def __init__(self):
        self.numbers = [1,2,3]

    def children(self):
        return [super().__init__(x=num) for num in self.numbers] # Now calls Thing.__init__ instead of object.__init__

class CompositeThing(Mixin, Thing):
    def __init__(self):
        super().__init__()

    def test(self):
        for child in self.children():
            print(child.x)

obj = CompositeThing()
obj.test()
...