Итак, я создаю набор простых сервисов, и мне надоело вручную создавать и жестко кодировать многие вещи, которые, как я знаю, Python могут выполнять динамически. В частности, я пытаюсь настроить простой диспетчер служб, чтобы я мог контролировать включение / выключение / сброс настроек. Теперь я уже знаю, как заставить Python выполнять эту фактическую функцию, но я хочу абстрагироваться, поэтому на высоком уровне разработчик или пользователь может сделать что-то вроде:
Service.power.reboot
В основном я хочу иметь основной класс (Service), который может принимать в качестве аргументов конкретную c услугу и действие (power и reboot, соответственно). Это будет сетевой сервис, сервис хранения и т. Д. c. До сих пор я делал следующее:
class Service:
def __init__(self, service, action):
self.service = service
self.action = action
def start(self): # action to be performed
pass
def stop(self):
pass
def restart(self):
pass
def enable(self):
pass
def disable(self):
pass
def status(self):
pass
псевдокодовая версия того, что я хотел бы сделать, что, я думаю, было бы лучше и разделить код больше:
Class Service:
def __init__(self, service, action):
self.service = service
self.action = action
def parse_request(self):
# figure out what the user wants to do to what, return the class and method
return serviceClass, serviceAction
def do_what_the_user_wants(self):
# call the class, run the method
return class.method
class PowerService:
def __init__(self, action):
self.action = action
def _parse_and_run_user_action_request:
# voodoo here to iterate over the available methods for self and run
return result
def run(self):
# run some power-related thing
return result
def stop(self):
# stop some power-related thing
return result
etc...
В этом случае пользователь похож на Service ('power', 'reboot') или, в идеале, Service.power.reboot (), сервисный модуль принимает аргументы (или что-либо после Service.), Цифры какой фактический сервис вызывать и какой метод запустить, и т. д. c и c.
Служба с именем Power - это класс, унаследованный от этого, но мне интересно, следует ли мне что-то делать во время init , чтобы проанализировать приведенные аргументы, решить, что он собирается делать, и затем динамически вызывать класс и выполнять заданное действие, не вводя классы по отдельности. Я думаю, что это было бы лучше (без кода, просто показывая поток того, что я имею в виду):
пользователь хочет, чтобы питание перезагрузилось -> Класс обслуживания получает команду, использующую класс питания, и это метод перезагрузки -> служба class принимает два аргумента, классифицирует класс и динамически запускает метод -> power power запускает метод перезагрузки, возвращает состояние -> класс обслуживания возвращает результат пользователю
Основная смущающая меня часть заключается в следующем: как я могу сделать impl / API / factory или что-то еще, чтобы взять кучу сложных модулей и использовать API (своего рода), чтобы брать в качестве аргументов строки или даже точечные обозначения, чтобы класс "API" или impl или что-то еще знали что с ними делать?
Я просто не нашел ничего, что действительно объясняет это правильно. Я знаю, что python может динамически вызывать функции, методы, классы и связанные с ними атрибуты, реквизиты и т. Д. c. Я просто не могу найти конкретный способ или, по крайней мере, шаблон дизайна, который имеет смысл.
Извините за скучный пост.