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

Использование методов наследников в базовом классе

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

Ученик и ИИ-наставник изучают тему «Использование методов наследников в базовом классе»
4.8 — Использование методов наследников в базовом классе

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

Теперь рассмотрим, как можно применить концепцию наследования и переопределения методов в контексте ИИ. Предположим, у нас есть базовый класс 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 сначала ищет методы в этом классе, и если они там реализованы, использует их, а не методы базового класса.

Таким образом, концепция переопределения методов в ООП позволяет нам создавать гибкие и расширяемые структуры классов, где производные классы могут определять собственные реализации методов, адаптированные под их специфику, но при этом сохранять общий интерфейс.