Множественное наследование в 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
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.
Смотрите также: