""" Урок 70. Наследование и полиморфизм — весь код примеров одним файлом. Источник: subjects/python-fundamentals/course/lessons/70-inheritance-polymorphism/examples.html Файл собран автоматически (tools/build_lesson_examples.py): правьте страницу урока. Запуск: python lesson-70.py """ # ==================================================================== # Пример 1. Наследование полей и методов # ==================================================================== class Employee: def __init__(self, name: str) -> None: self.name = name def work(self) -> None: print(f"{self.name} is working...") class Programmer(Employee): pass class Manager(Employee): pass programmer = Programmer("Alice") manager = Manager("Bob") programmer.work() manager.work() # ==================================================================== # Пример 2. Переопределение метода # ==================================================================== class Employee: def __init__(self, name: str) -> None: self.name = name def work(self) -> None: print(f"{self.name} is working...") class Programmer(Employee): def work(self) -> None: print(f"{self.name} writing code...") class Manager(Employee): def work(self) -> None: print(f"{self.name} managing team...") staff = [Programmer("Alice"), Manager("Bob"), Programmer("Bill")] for person in staff: person.work() # ==================================================================== # Пример 3. Попытка перегрузки # ==================================================================== class Math: def add(self, a: int, b: int) -> int: return a + b def add(self, a: int, b: int, c: int) -> int: return a + b + c m = Math() print(m.add(1, 2, 3)) # 6 # print(m.add(1, 2)) # TypeError: add() missing 1 required positional argument # ==================================================================== # Пример 4. super() в __init__ # ==================================================================== class Employee: def __init__(self, name: str) -> None: self.name = name class Programmer(Employee): def __init__(self, name: str, language: str) -> None: super().__init__(name) self.language = language class Manager(Employee): def __init__(self, name: str, department: str) -> None: super().__init__(name) self.department = department p = Programmer("Alice", "Python") print(p.name, p.language) m = Manager("Bob", "Development") print(m.name, m.department) # ==================================================================== # Пример 5. Многоуровневое наследование # ==================================================================== class Person: def __init__(self, name: str) -> None: self.name = name print(f"Init Person: {self.name}") class Employee(Person): def work(self) -> None: print(f"{self.name} is working...") class Manager(Employee): def __init__(self, name: str, department: str) -> None: super().__init__(name) self.department = department print(f"Init Manager: {self.name} manages {self.department}") m = Manager("Alice", "Development") # ==================================================================== # Пример 6. super() в обычном методе # ==================================================================== class Employee: def work(self) -> None: print("Employee is doing general tasks.") class Programmer(Employee): def work(self) -> None: super().work() print("Programmer is writing code.") class Manager(Employee): def work(self) -> None: super().work() print("Manager is holding a meeting.") staff = [Programmer(), Manager()] for person in staff: person.work() print() # ==================================================================== # Пример 7. isinstance и issubclass # ==================================================================== class Employee: def work(self) -> None: print("Выполняет общие задачи") class Programmer(Employee): def write_code(self) -> None: print("Пишет код") class Manager(Employee): def work(self) -> None: print("Проводит собрание") staff = [Programmer(), Manager(), Employee()] for person in staff: if isinstance(person, Programmer): person.write_code() else: person.work() print(issubclass(Programmer, Employee)) # True print(issubclass(Manager, Programmer)) # False # ==================================================================== # Пример 8. Наследование от object # ==================================================================== class Book: pass b = Book() print(b.__str__()) print(b) print(isinstance(b, object)) # True