ООП: Использование условного оператора при инициализации класса - PullRequest
0 голосов
/ 06 июня 2018

Этот вопрос направлен на лучшие практики ООП.

Справочная информация:

Я создал набор сценариев, которые либо автоматически запускаются cronjobs, либо постоянно работают в фоновом режиме для сбора данных.в настоящее время.В прошлом я использовал smtplib из Python для отправки себе уведомлений, когда возникают ошибки или работа успешно завершена.Недавно я перенес эти программы на платформу Google Cloud, которая по умолчанию блокирует популярные SMTP-порты.Чтобы обойти это, я использовал почтовую команду linux, чтобы продолжать отправлять себе отчеты.

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

Пример:

$ python mycode.py my_arg

if sys.argv[1] == 'my_arg':
    mailer = Class1()
else:
    mailer = Class2()

Я хочу улучшить это и создать модуль, который автоматически обрабатывает это без добавления кода.У меня есть вопрос: «Правильно ли» включать условную инструкцию при инициализации класса, чтобы справиться с ситуацией?

Пример:

Class Alert(object):
    def __init__(self, sys.platform, other_args):

         # Google Cloud Platform
         if sys.platform == "linux":
              #instantiate Class1 variables and methods

         #local copy
         else:
              #instantiate Class2 variables and methods

Мой инстинкт кишки говорит, что это неправильно, ноЯ не уверен, какой будет правильный подход.

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

Редактировать: После некоторых предложений вот мои любимые чтения по этой теме.

http://python -3-patterns-idioms-test.readthedocs.io / en / latest / Factory.html

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

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

0 голосов
/ 06 июня 2018

Это способ сделать это.Но я бы предпочел использовать что-то вроде создания динамического экземпляра класса.Для этого у вас может быть только один класс вместо двух разных классов.Затем класс будет принимать некоторые аргументы и возвращать результат в зависимости от предоставленных аргументов.Есть довольно много примеров, и я уверен, что вы можете использовать их в своем случае.Попробуйте поискать, как создать динамический класс в Python.

...