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

Класс может быть производным от более чем одного суперкласса в Python. Это называется множественным наследованием.

Например, класс Bat (Летучая мышь) является производным от суперклассов Mammal (Млекопитающее) и WingedAnimal (Крылатое животное). Это имеет смысл, потому что летучая мышь — это млекопитающее, а также крылатое животное.

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

Синтаксис множественного наследования в Python

class SuperClass1:
    # features of SuperClass1

class SuperClass2:
    # features of SuperClass2

class MultiDerived(SuperClass1, SuperClass2):
    # features of SuperClass1 + SuperClass2 + MultiDerived class

Здесь класс MultiDerived является производным от классов SuperClass1 и SuperClass2.


Пример: Множественное наследование в Python

class Mammal:
    def mammal_info(self):
        print("Mammals can give direct birth.")

class WingedAnimal:
    def winged_animal_info(self):
        print("Winged animals can flap.")

class Bat(Mammal, WingedAnimal):
    pass

# create an object of Bat class
b1 = Bat()

b1.mammal_info()
b1.winged_animal_info()

Вывод

Mammals can give direct birth.
Winged animals can flap.

В приведённом выше примере класс Bat является производным от двух супер-классов: Mammal и WingedAnimal. Обратите внимание на операторы:

b1 = Bat()
b1.mammal_info()
b1.winged_animal_info()

Здесь мы используем b1 (объект Bat) для доступа к методам mammal_info() и winged_animal_info() классов Mammal и WingedAnimal соответственно.


Многоуровневое наследование в Python

В Python мы можем не только получить класс из суперкласса, но также можем получить класс из производного класса. Эта форма наследования известна как многоуровневое наследование.

Вот синтаксис многоуровневого наследования:

class SuperClass:
    # Super class code here

class DerivedClass1(SuperClass):
    # Derived class 1 code here

class DerivedClass2(DerivedClass1):
    # Derived class 2 code here

Здесь класс DerivedClass1 является производным от класса SuperClass, а класс DerivedClass2 является производным от класса DerivedClass1.

Многоуровневое наследование в Python

Пример: Многоуровневое наследование в Python

class SuperClass:

    def super_method(self):
        print("Super Class method called")

# define class that derive from SuperClass
class DerivedClass1(SuperClass):
    def derived1_method(self):
        print("Derived class 1 method called")

# define class that derive from DerivedClass1
class DerivedClass2(DerivedClass1):

    def derived2_method(self):
        print("Derived class 2 method called")

# create an object of DerivedClass2
d2 = DerivedClass2()

d2.super_method()  # Output: "Super Class method called"

d2.derived1_method()  # Output: "Derived class 1 method called"

d2.derived2_method()  # Output: "Derived class 2 method called"

Вывод

Super Class method called
Derived class 1 method called
Derived class 2 method called

В приведённом выше примере DerivedClass2 является производным от DerivedClass1, который, в свою очередь, является производным от SuperClass.

Это означает, что DerivedClass2 наследует все атрибуты и методы как DerivedClass1, так и SuperClass.

Следовательно, мы используем d2 (объект DerivedClass2) для вызова методов из SuperClass, DerivedClass1 и DerivedClass2.


Порядок разрешения методов (MRO) в Python

Если два суперкласса имеют одинаковое имя метода (функции), и производный класс вызывает этот метод, Python использует MRO для поиска правильного метода для вызова. Например:

class SuperClass1:
    def info(self):
        print("Super Class 1 method called")

class SuperClass2:
    def info(self):
        print("Super Class 2 method called")

class Derived(SuperClass1, SuperClass2):
    pass

d1 = Derived()
d1.info()

# Output: "Super Class 1 method called"

Здесь оба класса SuperClass1 и SuperClass2 определяют метод info().

Поэтому, когда info() вызывается с использованием объекта d1 класса Derived, Python использует MRO для определения того, какой метод вызвать.

В этом случае MRO указывает, что методы должны наследоваться сначала от самого левого суперкласса, поэтому вызывается info() класса SuperClass1, а не SuperClass2.


Смотрите также: