class Child(Parent1, Parent2): ...
.
Parent1.attribute
или Parent2.attribute
для явного указания, из какого класса брать атрибут.Child.__mro__
или Child.mro()
.super()
с осторожностью, понимая MRO, чтобы избежать нежелательного поведения. Особенно важно при использовании super()
в нескольких наследуемых классах.Множественное наследование в Python позволяет классу наследовать атрибуты и методы от нескольких родительских классов. Это мощный инструмент, но он требует осторожного использования, чтобы избежать конфликтов имен и неоднозначности.
Как использовать множественное наследование:
Просто перечислите классы-родители в скобках после имени дочернего класса при его определении. Порядок, в котором указываются родительские классы, имеет значение, поскольку он определяет порядок поиска атрибутов, используемый методом `__mro__`.
class ClassA:
def method(self):
print("Method from ClassA")
class ClassB:
def method(self):
print("Method from ClassB")
class ClassC(ClassA, ClassB):
pass # ClassC inherits from A and B
instance = ClassC()
instance.method() # Prints "Method from ClassA" because A is listed first
Как избежать конфликтов атрибутов (проблема "алмазного наследования"):
print(ClassC.__mro__) # Example output: (<class '__main__.ClassC'>, <class '__main__.ClassA'>, <class '__main__.ClassB'>, <class 'object'>)
class ClassA:
def method(self):
print("Method from ClassA")
class ClassB:
def method(self):
print("Method from ClassB")
class ClassC(ClassA, ClassB):
def method(self):
ClassB.method(self) # Call method from ClassB
print("Method from ClassC")
instance = ClassC()
instance.method() # Prints "Method from ClassB" followed by "Method from ClassC"
class ClassA:
def __init__(self, a):
print("ClassA init")
self.a = a
class ClassB:
def __init__(self, b):
print("ClassB init")
self.b = b
class ClassC(ClassA, ClassB):
def __init__(self, a, b):
ClassA.__init__(self, a) # Be careful to use same arguments or unexpected results may occur
ClassB.__init__(self, b)
print("ClassC init")
self.c = a + b
instance = ClassC(1, 2) # Calls ClassA.__init__, ClassB.__init__, and ClassC.__init__
class LoggingMixin:
def log(self, message):
print(f"LOG: {message}")
class MyClass(LoggingMixin):
def do_something(self):
self.log("Doing something...")
# ... rest of the method ...
Важно помнить: Множественное наследование следует использовать с осторожностью. Чрезмерное использование может привести к сложному и трудно поддерживаемому коду. Всегда оценивайте, является ли это действительно лучшим решением для вашей конкретной задачи.