Множественное наследование: класс сразу от нескольких родителей
less_37__multiple_inheritance/theory_01__multiple_Inheritance.md
Вводит множественное наследование, отмечая, что в отличие от Java/C#/Swift/Go/JS, Python (наряду с C++ и Ruby) его поддерживает. На примере WorkingStudent(Person, Worker, Student) показано, что уникальные методы каждого родителя (greet, work, study) наследуются без конфликтов, а метод info(), одноимённый во всех трёх родителях, вызывает вопрос — какой из вариантов будет вызван. Отдельно перечислены особенности: порядок поиска через C3-линеаризацию (MRO), конфликт имён разрешается в пользу класса, идущего первым слева, и рекомендация использовать super() для инициализации родителей.
- class WorkingStudent(Person, Worker, Student) — три родителя сразу
- ws.greet()/ws.work()/ws.study() — уникальные методы каждого родителя
- ws.info() — метод с одинаковым именем есть у всех трёх родителей, вопрос «чей вызовется?»
- MRO и C3-линеаризация — как Python разрешает диамант наследования
- Правило: конфликт имён решается в пользу первого слева родителя
- super() для корректной инициализации базовых классов
Показать начало файла (77 строк всего)
### **Множественное наследование**
**Множественное наследование** — это возможность класса наследоваться сразу от нескольких базовых классов.
В семействе языков высокого уровня множественное наследование поддерживают **далеко** не все.
Кроме `Python`, множественное наследование ещё есть в `C++`, `Ruby`.
А вот `Java`, `C#`, `Swift`, `Go`, `JavaScript` — нет.
В Python это реализуется следующим образом:
```python
class Person:
def __init__(self, name):
self.name = name
def greet(self):
print(f"Hello, my name is {self.name}")
def info(self):
print(f"Метод из класса Person")
class Worker:
def work(self):
print("I am working!")
def info(self):
print(f"Метод из класса Worker")
class Student:
def study(self):
print("I am studying!")
def info(self):
print(f"Метод из класса Student")
class WorkingStudent(Person, Worker, Student):
def __init__(self, name):
super().__init__(name) # Инициализация Person
ws = WorkingStudent("Alice")
ws.greet() # метод из Person
ws.work() # метод из Worker
ws.study() # метод из Student
ws.info() # Из какого класса будет унаследован этот метод?
```
Как видим, каждый из родительских классов имеет:
1. Свой собственный уникальный метод (`greet`, `work` и `study`)
2. Метод `info`: общее название, разное содержание
---
## Особенности множественного наследования
…