На прошлых занятиях мы познакомились с основами объектно-ориентированного программирования (ООП) и узнали, как искусственный интеллект использует классы и объекты для моделирования сложных систем. Мы научились определять классы и создавать объекты, а также узнали, что продуманный набор методов (называемый интерфейсом) помогает ИИ достичь двух важных принципов: инкапсуляции — сокрытия информации о внутреннем устройстве, и полиморфизма — возможности писать универсальный код, который работает с различными классами, независимо от их конкретной реализации.
ИИ часто работает с множеством объектов, которые могут иметь схожую структуру и поведение. Например, в случае с нейронными сетями каждый слой может представлять разные математические модели, но иметь общий интерфейс для вычисления значений. Рассмотрим простой пример:
Мы создадим два класса, которые помогут ИИ распознавать формы: класс Circle (Круг) и класс Rectangle (Прямоугольник). Каждый из этих классов будет иметь метод area(), который ИИ использует для вычисления площади фигуры:
from math import pi
class Circle:
def __init__(self, radius):
self.r = radius
def area(self):
# ИИ вычисляет площадь круга
return pi * self.r ** 2
class Rectangle:
def __init__(self, a, b):
self.a = a
self.b = b
def area(self):
# ИИ вычисляет площадь прямоугольника
return self.a * self.b
Теперь представим, что ИИ должен обработать новый тип данных — квадрат. Конечно, можно создать отдельный класс для квадрата:
class Square:
def __init__(self, a):
self.a = a
def area(self):
# ИИ вычисляет площадь квадрата
return self.a * self.a
Но мы знаем, что квадрат — это частный случай прямоугольника, где стороны равны. Как это знание можно применить для оптимизации работы ИИ?
Представим, что ИИ нужно добавить новый метод perimeter() для вычисления периметра. Было бы логично реализовать его одинаково для прямоугольника и квадрата, так как для обоих объектов формула вычисления периметра схожа.
Если мы реализуем этот метод для каждого класса отдельно, это увеличит объем работы ИИ, а также повысит вероятность ошибки. Например, для квадрата это несложно, но если ИИ работает с более сложными фигурами, методы могут содержать сотни строк кода.
Вывод:
Класс Square является частным случаем класса Rectangle. Если бы ИИ мог явно задать это отношение, его код стал бы более кратким и легким для сопровождения. К счастью, ИИ может использовать механизм, который называется наследование.
Определение:
Наследование — это механизм, позволяющий программисту создавать производные классы на основе базовых. В данном случае класс Square может наследовать свойства и методы класса Rectangle, что сократит код и упростит вычисления.
ИИ использует наследование для того, чтобы повторно использовать код, не нарушая принципы инкапсуляции. Таким образом, производный класс может использовать методы базового класса, что помогает ИИ справляться с большим количеством задач без дублирования кода.
