Мы с вами познакомились с основами объектно-ориентированного программирования и узнали, как классы могут наследовать методы и атрибуты друг от друга. Теперь мы рассмотрим механизм наследования.
Представь, что каждый класс — это разные компоненты ИИ-системы, а наследование — это способ делиться методами и знаниями между этими компонентами.
Что происходит при наследовании в ИИ-системах?
Когда один класс наследуется от другого, как в примере 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()}")
Мы увидели, как классы компонентов могут наследовать методы друг от друга. ИИ-наставник ставит задачу, а наследование помогает построить систему без дублирования кода.
