Теперь рассмотрим, как можно применить концепцию наследования и переопределения методов в контексте ИИ. Предположим, у нас есть базовый класс AIModel, который определяет основные методы для всех моделей. У каждой модели, производной от этого класса, есть свои специфические методы для вычисления точности и обработки данных, но они должны следовать общему интерфейсу.
Базовый класс: AIModel
Мы создадим базовый класс AIModel с методами describe, accuracy, и process\_data, которые переопределяются в производных классах.
class AIModel:
def describe(self):
print(f"Model: {self.__class__.__name__}")
print(f"Accuracy: {self.accuracy()}")
print(f"Processing Data: {self.process_data()}")
def accuracy(self):
raise NotImplementedError("Подкласс должен реализовать accuracy()")
def process_data(self):
raise NotImplementedError("Подкласс должен реализовать process_data()")
В базовом классе методы accuracy() и process_data() вызывают NotImplementedError, потому что корректный результат может определить только конкретный подкласс. Это не позволяет программе молча вывести неверные данные.
Подкласс: TextModel
Класс TextModel наследуется от AIModel и переопределяет методы accuracy и process\_data для работы с текстовыми данными.
class TextModel(AIModel):
def __init__(self, model_name, accuracy_score):
self.model_name = model_name
self.accuracy_score = accuracy_score
def accuracy(self):
return f"Text model accuracy: {self.accuracy_score * 100}%"
def process_data(self):
return "Processing text data using tokenization and embedding."
Подкласс: ImageModel
Класс ImageModel наследуется от AIModel и переопределяет методы accuracy и process\_data для работы с изображениями.
class ImageModel(AIModel):
def __init__(self, model_name, accuracy_score):
self.model_name = model_name
self.accuracy_score = accuracy_score
def accuracy(self):
return f"Image model accuracy: {self.accuracy_score * 100}%"
def process_data(self):
return "Processing image data using convolutional layers."
Универсальная функция describe\_model
Мы можем написать универсальную функцию для вывода информации о любой модели. Благодаря полиморфизму, функция будет корректно работать с любыми производными классами, так как они реализуют методы accuracy и process\_data.
def describe_model(model):
model.describe()
Пример использования
# Создание текстовой модели
text_model = TextModel("GPT-4", 0.95)
# Создание модели для изображений
image_model = ImageModel("ResNet", 0.89)
# Вывод описания текстовой модели
describe_model(text_model)
# Вывод описания модели для изображений
describe_model(image_model)
Примеры ввода/вывода:
Ввод:
describe_model(TextModel("GPT-4", 0.95))
Вывод:
Model: TextModel
Accuracy: Text model accuracy: 95.0%
Processing Data: Processing text data using tokenization and embedding.
Переопределение методов
Здесь методы accuracy и process\_data переопределены в производных классах TextModel и ImageModel. Когда вызывается метод describe у объекта класса-потомка, Python сначала ищет методы в этом классе, и если они там реализованы, использует их, а не методы базового класса.
Таким образом, концепция переопределения методов в ООП позволяет нам создавать гибкие и расширяемые структуры классов, где производные классы могут определять собственные реализации методов, адаптированные под их специфику, но при этом сохранять общий интерфейс.
