Способ уменьшить количество кода, который повторяется в вашем проекте.
Во многих языках программирования более высокого уровня, таких как 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 на практике.
Вот краткое изложение этого процесса:
- Найдите повторяющийся фрагмент кода.
- Создайте базовый класс, который надежно инкапсулирует этот код (в нем будут все проверки, блоки try / except) и четкую политику возвращаемого значения.
- Наследуйте от этого базового класса.
- Получите доступ к методам класса с помощью объекта
self
и убедитесь, что учтены все сценарии использования методов (исключения, проверка отсутствия и т. Д.)
Надеюсь, это вам помогло! Если у вас есть вопросы, не стесняйтесь оставлять их ниже!
Спасибо за прочтение!