Курс 3.4 · Раздел 04 · Урок 4.3

Механизм наследования

Разберём тему на понятных примерах и закрепим её практикой.

Ученик и ИИ-наставник изучают тему «Механизм наследования»
4.3 — Механизм наследования

Материал урока

Мы с вами познакомились с основами объектно-ориентированного программирования и узнали, как классы могут наследовать методы и атрибуты друг от друга. Теперь мы рассмотрим механизм наследования.

Представь, что каждый класс — это разные компоненты ИИ-системы, а наследование — это способ делиться методами и знаниями между этими компонентами.

Что происходит при наследовании в ИИ-системах?

Когда один класс наследуется от другого, как в примере class B(A), класс B получает доступ к методам класса A и может добавлять собственные. Никакого обучения здесь не происходит: Python использует уже написанный код базового класса.

Процесс поиска методов в ИИ-компонентах

Когда мы обращаемся к методу объекта, Python использует установленный порядок поиска методов: сначала проверяет класс объекта, а затем его базовые классы. Этот порядок можно увидеть с помощью метода mro().

Давай посмотрим на пример:

class BaseAIComponent:
    def analyze_data(self):
        print("Анализ данных...")

class ImageRecognitionAI(BaseAIComponent):
    def recognize_image(self):
        print("Распознавание изображения...")
        
# Создаем экземпляр ImageRecognitionAI
ai = ImageRecognitionAI()
ai.analyze_data()  # Этот метод унаследован от базового ИИ-компонента
ai.recognize_image()  # Этот метод принадлежит непосредственно ImageRecognitionAI

В этом примере компонент ImageRecognitionAI умеет распознавать изображения, но также он унаследовал способность анализировать данные от базового компонента BaseAIComponent. Это позволяет избежать повторного написания кода и создаёт более гибкую ИИ-систему.

Пример с геометрическими фигурами

Теперь представим, что у нас есть базовый ИИ-класс ShapeAI, который обучает ИИ работать с различными геометрическими объектами. Этот класс включает метод describe, который "объясняет" ИИ, с какой именно фигурой он работает. Далее создадим два производных класса: CircleAI и RectangleAI, каждый из которых наследует "знания" о фигурах от ShapeAI.

class ShapeAI:

    def describe(self):

        print(f"ИИ анализирует фигуру: {self.__class__.__name__}")



class CircleAI(ShapeAI):

    def __init__(self, radius):

        self.radius = radius



    def calculate_area(self):

        return 3.14159 * self.radius ** 2



class RectangleAI(ShapeAI):

    def __init__(self, length, width):

        self.length = length

        self.width = width



    def calculate_area(self):

        return self.length * self.width

Теперь проверим, как работает наследование:

# Создаем экземпляры ИИ-компонентов

circle_ai = CircleAI(5)

rectangle_ai = RectangleAI(4, 6)



# Используем метод describe из базового класса

circle_ai.describe()  # ИИ анализирует фигуру: CircleAI

rectangle_ai.describe()  # ИИ анализирует фигуру: RectangleAI



# Вычисляем площади

print(f"Площадь круга: {circle_ai.calculate_area()}")  # Площадь круга: 78.53975

print(f"Площадь прямоугольника: {rectangle_ai.calculate_area()}")  # Площадь прямоугольника: 24

Добавляем новый метод в ИИ-компонент

Теперь добавим в CircleAI новый метод create\_square, который "обучит" ИИ создавать квадрат с такой же площадью, как у круга.

class CircleAI(ShapeAI):

    def __init__(self, radius):

        self.radius = radius



    def calculate_area(self):

        return 3.14159 * self.radius ** 2



    def create_square(self):

        side = (self.calculate_area()) ** 0.5

        return RectangleAI(side, side)

Таким образом, ИИ-компонент CircleAI может вычислить площадь круга и создать квадрат с той же площадью:

circle_ai = CircleAI(3)

square_ai = circle_ai.create_square()



print(f"Площадь круга: {circle_ai.calculate_area()}")

print(f"Площадь квадрата: {square_ai.calculate_area()}")

Мы увидели, как классы компонентов могут наследовать методы друг от друга. ИИ-наставник ставит задачу, а наследование помогает построить систему без дублирования кода.