Как заставить 3 класса работать вместе в одном базовом классе в Python 3? - PullRequest
0 голосов
/ 07 апреля 2020

Итак, я создаю набор простых сервисов, и мне надоело вручную создавать и жестко кодировать многие вещи, которые, как я знаю, 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. Я просто не могу найти конкретный способ или, по крайней мере, шаблон дизайна, который имеет смысл.

Извините за скучный пост.

1 Ответ

0 голосов
/ 08 апреля 2020

Существует еще одна опция, которая заключается в передаче метода экземпляра в класс обслуживания:

class Service:

    def __init__(self, action):
        self.action = action

    def doAction(self):  # action to be performed
        self.action()

class PowerService:

    def reboot(self):
        # Do some booty things

power = PowerService()

rebooter = Service(power.reboot)

rebooter.doAction()  # calls power.reboot()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...