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

Множественное наследование

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

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

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

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

Предположим, у нас есть два базовых класса: NeuralNetwork и Optimizable. Класс NeuralNetwork представляет общие методы и свойства нейронной сети, а класс Optimizable — методы, связанные с оптимизацией моделей. Мы создадим производный класс OptimizedNeuralNetwork, который будет наследовать оба базовых класса, сочетая функциональность нейронной сети и возможности оптимизации.

Базовый класс: NeuralNetwork

Этот класс будет содержать базовые методы, такие как train и predict, которые общие для всех нейронных сетей.

class NeuralNetwork:

    def __init__(self, layers):

        self.layers = layers



    def train(self):

        return "Training the neural network with {} layers".format(self.layers)



    def predict(self, input_data):

        return "Predicting using the neural network with {} layers".format(self.layers)

Базовый класс: Optimizable

Этот класс реализует методы, связанные с оптимизацией моделей, такие как optimize.

class Optimizable:

    def __init__(self, optimizer):

        self.optimizer = optimizer



    def optimize(self):

        return "Optimizing model with {}".format(self.optimizer)

Подкласс: OptimizedNeuralNetwork

Теперь мы создадим производный класс OptimizedNeuralNetwork, который будет объединять функциональность обоих базовых классов.

class OptimizedNeuralNetwork(NeuralNetwork, Optimizable):

    def __init__(self, layers, optimizer):

        # Явно вызываем конструкторы базовых классов

        NeuralNetwork.__init__(self, layers)

        Optimizable.__init__(self, optimizer)



    def describe(self):

        return "Optimized Neural Network: {} layers, using optimizer {}".format(self.layers, self.optimizer)

Пример использования

# Создаем оптимизированную нейронную сеть с 5 слоями и оптимизатором 'Adam'

optimized_nn = OptimizedNeuralNetwork(5, 'Adam')



# Тренировка модели

print(optimized_nn.train())

# Оптимизация модели

print(optimized_nn.optimize())

# Описание модели

print(optimized_nn.describe())

# Предсказание модели

print(optimized_nn.predict([1, 2, 3]))

Примеры ввода/вывода:

Ввод:

optimized_nn = OptimizedNeuralNetwork(5, 'Adam')

optimized_nn.train()

Вывод:

Training the neural network with 5 layers

Множественное наследование и порядок разрешения методов (MRO)

Когда используется множественное наследование, возникает вопрос: какой метод будет вызван, если базовые классы содержат методы с одинаковыми названиями? Python применяет установленный порядок разрешения методов (MRO). Его не стоит сводить к простому просмотру родителей слева направо; фактическую последовательность всегда можно проверить методом mro().

Ты можешь проверить порядок разрешения методов с помощью метода mro():

print(OptimizedNeuralNetwork.mro())

Вывод:

[<class '__main__.OptimizedNeuralNetwork'>, <class '__main__.NeuralNetwork'>, <class '__main__.Optimizable'>, <class 'object'>]

Этот механизм гарантирует, что методы будут вызваны в правильном порядке, без конфликтов между базовыми классами.