Множественное наследование с использованием Super (Subclass, self) в python 2.7 - PullRequest
0 голосов
/ 25 мая 2020

Я хотел бы понять, разрешено ли множественное наследование в Python 2.7 от класса, родительский элемент которого не является объектом?

Ref: TypeError в Python одиночное наследование с атрибутом «super» приведу несколько примеров, но я бы хотел использовать super (Subclass, self) иначе, как показано ниже

Animal -> Mammal -> CannoFly & CannotSwim -> Dog

Итак, класс Dog наследуется от классов CannotFly и CannotSwim. Каждый из классов CannotFly и CannotSwim наследуется от Mammal, который наследуется от классов Animal

    class Animal:
    def __init__(self, animalName):
        print(animalName, 'is an animal.');


# Mammal inherits Animal
class Mammal(Animal):
    def __init__(self, mammalName):
        print(mammalName, 'is a mammal.')
        super(Mammal,self).__init__(mammalName)


# CannotFly inherits Mammal
class CannotFly(Mammal):
    def __init__(self, mammalThatCantFly):
        print(mammalThatCantFly, "cannot fly.")
        super(CannotFly,self).__init__(mammalThatCantFly)


# CannotSwim inherits Mammal
class CannotSwim(Mammal):
    def __init__(self, mammalThatCantSwim):
        print(mammalThatCantSwim, "cannot swim.")
        super(CannotSwim,self).__init__(mammalThatCantSwim)


# Dog inherits CannotSwim and CannotFly
class Dog(CannotSwim, CannotFly):
    def __init__(self,arg):
        print("I am a barking dog")
        super(Dog, self).__init__(arg)



# Driver code
Dog1 = Dog('Bark')

Когда я запускаю его, я получаю сообщение об ошибке «TypeError: должно быть типом, а не classobj», потому что CanotSwim () & Классы CannotFly () являются производными от Mammal, который не является базовым классом, но наследуется от класса Animal. Если это не так, то Super (Subclass, self) работает отлично.

1 Ответ

1 голос
/ 25 мая 2020

В Python 2, super не работает с объектами, которые не наследуются (прямо или косвенно) от object.

Множественное наследование разрешено со старым -style, но может иметь неожиданное поведение из-за проблемы с алмазом (см. раздел 2.3 здесь ).

По этим причинам (и многим другим) рекомендуется всегда наследовать от object в Python 2.

...