Множественное наследование в Python

Наследование позволяет нам использовать функции родительского класса в дочернем классе и является важной функцией объектно-ориентированного программирования. Это помогает с возможностью повторного использования и транзитивности данных из родительского класса в дочерний класс и компенсирует потерю данных.

Множественное наследование - это когда дочерний класс наследует методы и функции от двух или более родительских классов. Полезно получать сразу все данные. Тем не менее, с другой стороны, это связано со сложностью использования и неоднозначностью. Неоднозначно сказать, какая особенность от какого родителя, если несколько родителей обладают одной и той же функцией. Это происходит, когда множественное наследование не используется или не реализовано правильно. Виртуальное наследование, использование порядка разрешения методов (MRO) и функции super() могут как-то снизить его риски.

В следующем коде мы видим базовый пример множественного наследования.

class Father():
    def drive(self):
        print("Father drives his son to school")

class Mother():
    def cook(self):
        print("Mother loves to cook for her son")

class Son(Father, Mother):
    def love(self):
        print("I love my Parents")
    
c=Son()
c.drive()
c.cook()
c.love()

Выход:

Father drives his son to school
Mother loves to cook for her son
I love my parents

Дочерний класс Son является производным от родительских классов Father и Mother, что позволяет ему использовать функции drive() и cook() для получения желаемого результата.

Функция super() ссылается на родительский или родственный класс в унаследованном дочернем классе и возвращает временный объект, который позволяет дочернему классу использовать все методы суперкласса.

Обычно это делается в случае двусмысленности, когда наследование начинает пересекать пути, то есть когда два родительских класса также являются производными от супербазового класса.

Например,

class Animals:
    def __init__(self, animalsName):
        print(animalsName, 'is an animal.');


class Mammal(Animals):
    def __init__(self, Name):
        print(Name, 'is a mammal.')
        super().__init__(Name)
    

class donotFly(Mammal):
      def __init__(self, name):
        print(name, "cannot fly.")
        super().__init__(name)


class donotSwim(Mammal):
    def __init__(self, name):
        print(name, "cannot swim.")
        super().__init__(name)


class Cat(donotSwim, donotFly):
    def __init__(self):
        print('A cat.');
        super().__init__('Cat')

cat = Cat()
print('')
bat = donotSwim('Bat')

Выход:

A cat.
Cat cannot swim.
Cat cannot fly.
Cat is a mammal.
Cat is an animal.

Bat cannot swim.
Bat is a mammal.
Bat is an animal.

Создается дочерний класс Cat, унаследованный от двух родительских классов donotswim и donotfly. Затем класс Mammals наследует их самих. Кроме того, класс Mammals наследует свойства суперкласса Animals. Поэтому в данном случае мы использовали функцию super() для простого доступа к методам суперкласса.

Сопутствующая статья - Python Class

  • Статические переменные класса в Python
  • Статический метод Python
  • Метаклассы в Python
  • Частные методы в Python