Да, Python полностью поддерживает множественное наследование (multiple inheritance) - возможность класса наследоваться от нескольких родительских классов одновременно. Это мощная, но требующая аккуратного использования особенность языка.
Базовый синтаксис:
class Parent1:
def method1(self):
print("Method from Parent1")
class Parent2:
def method2(self):
print("Method from Parent2")
class Child(Parent1, Parent2): # Множественное наследование
def child_method(self):
print("Child method")
Python использует алгоритм C3 linearization для определения порядка поиска методов при множественном наследовании. Порядок можно посмотреть через атрибут __mro__
:
print(Child.__mro__)
# Выведет: (<class '__main__.Child'>, <class '__main__.Parent1'>, <class '__main__.Parent2'>, <class 'object'>)
Миксины - это небольшие классы, добавляющие конкретную функциональность:
class JSONMixin:
def to_json(self):
import json
return json.dumps(self.__dict__)
class XMLMixin:
def to_xml(self):
# реализация XML-сериализации
pass
class Person(JSONMixin, XMLMixin):
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("Ivan", 30)
print(p.to_json()) # Используем функциональность миксина
Можно комбинировать несколько абстрактных классов:
from abc import ABC, abstractmethod
class Readable(ABC):
@abstractmethod
def read(self):
pass
class Writable(ABC):
@abstractmethod
def write(self):
pass
class IODevice(Readable, Writable):
def read(self):
# реализация
pass
def write(self):
# реализация
pass
Ситуация, когда класс наследуется от двух классов, которые сами наследуются от одного общего предка:
class A:
def method(self):
print("A")
class B(A):
def method(self):
print("B")
super().method()
class C(A):
def method(self):
print("C")
super().method()
class D(B, C):
def method(self):
super().method()
d = D()
d.method() # Выведет: B → C → A (благодаря MRO)
Если в разных родительских классах есть методы с одинаковыми именами, используется первый найденный согласно MRO.
Множественное наследование - мощный инструмент, но "с большой силой приходит большая ответственность". Используйте его осознанно и только когда это действительно необходимо.