Способ уменьшить количество кода, который повторяется в вашем проекте.

Во многих языках программирования более высокого уровня, таких как C ++, C #, Python и Java, наследование является полезным инструментом, позволяющим избежать повторения кода в нескольких местах.

В этой статье я научу вас использовать функцию наследования Python. Я не буду углубляться в преимущества или недостатки использования наследования по сравнению с другим типом теории программирования, например с композицией. Тем не менее, я настоятельно рекомендую вам прочитать об этом.

Давайте нырнем!

Начать с класса

Допустим, у вас есть класс обработчика сервера (не беспокойтесь, если вы не знаете, что это значит, относитесь к нему как к классу), и часть его поведения заключается в синтаксическом анализе JSON (тела запроса).

Вот как это выглядит:

class MyClass:
    def my_method(self,request_body):
        try:
            request_body = json.loads(request_body)
        except JSONDecodeError as e:
            MyImaginaryLogger.error(f'an error occurred: {str(e)}')
            return
        print(request_body)

Скажем, для простоты вам нужно распечатать это тело запроса.

Давайте определим последствия

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

Должны ли мы повторять один и тот же фрагмент кода в каждом из наших десяти классов?

Ответ однозначный: нет!

Что, если мы обнаружим ошибку в этой реализации? Должен ли я исправить это в каждом из этих классов? Я бы предпочел исправить только одно место в моем коде.

Вот как предотвратить это дублирование кода с помощью наследования.

Используйте базовый класс

Итак, вы поняли, что в ваших классах есть повторяющийся фрагмент кода. Пришло время создать базовый класс, который включает этот код и определяет поведение, на которое вы можете положиться.

Вот пример:

class MyBaseClass:
    def parse_request_body(self,request_body):
        try:
            request_body = json.loads(request_body)
        except JSONDecodeError as e:
            MyImaginaryLogger.error(f'an error occurred: {str(e)}
            return None
        return request_body
    # The method will return the object itself if it succeeded, and will return None if it failed parsing the body.

Вам не нужно выбирать объект или нет подход, который я показал выше. Вы можете быть более строгими и решить, что этот метод либо будет успешным, либо выдаст настраиваемое исключение, с которым остальная часть вашего кода знает, как бороться. Выбор за вами - убедитесь, что это надежное поведение.

Наследовать от этого класса

Теперь, когда вы поместили повторяющийся код в базовый класс, пора наследовать от него.

Вы наследуете класс в Python, помещая его имя в круглые скобки рядом с именем класса, например:

class MyClass(MyBaseClass):
    ...

Таким образом, мы получаем доступ ко всему, что может предложить этот класс.

Собираем все вместе

Итак, теперь, когда мы узнали, как использовать наследование в Python, давайте вернемся к нашему исходному коду и исправим его:

class MyClass(MyBaseClass):
    def my_method(self,request_body):
        parsed_request_body = self.parse_request_body(request_body)
        if parsed_request_body is None:
            # Do something about bad request.
        print(request_body)

Теперь вам больше не нужно иметь дело с блоком try / except в каждом из ваших классов. Вам нужно иметь дело только с синтаксическим анализом в одном месте. И, унаследовав от нашего базового класса, теперь у нас есть доступ к методу с использованием объекта self.

Не забывайте учитывать все сценарии кода вашего базового класса. Если вы генерируете настраиваемое исключение, обязательно поймайте его здесь. Если вы вернете None, обязательно отметьте None здесь и т. Д.

Заключение

В этой статье я продемонстрировал, как использовать наследование Python на практике.

Вот краткое изложение этого процесса:

  1. Найдите повторяющийся фрагмент кода.
  2. Создайте базовый класс, который надежно инкапсулирует этот код (в нем будут все проверки, блоки try / except) и четкую политику возвращаемого значения.
  3. Наследуйте от этого базового класса.
  4. Получите доступ к методам класса с помощью объекта self и убедитесь, что учтены все сценарии использования методов (исключения, проверка отсутствия и т. Д.)

Надеюсь, это вам помогло! Если у вас есть вопросы, не стесняйтесь оставлять их ниже!

Спасибо за прочтение!