Python - модель устройства с различными режимами работы - PullRequest
0 голосов
/ 21 февраля 2020

Я заинтересован в моделировании устройства в Python. Давайте возьмем камеру, например, с двумя различными режимами работы, то есть режим фото и видео. В общем, методы из режима фото не должны вызываться при активном режиме видео и наоборот. И. е. Нельзя изменять частоту кадров (fps) в режиме видео в режиме фотосъемки.

Одной из идей реализации этого устройства с ограниченным доступом к другим режимам является создание класса контроллера, который управляет связью между компоненты внутри камеры (открыть / закрыть последовательные порты, выполнить тесты оборудования и т. д. c.). Внутри класса контроллера реализованные режимы (режим фото и видео) могут быть назначены контроллеру, а режимы могут быть реализованы как собственные классы / библиотеки.

Допустимый набор команд может быть:

# Python 3
CameraController = Controller()  # Creates an instance of the controller class 'Controller'
CameraController.open()  # Opens all communication ports and other things
CameraController.PhotoMode.open()  # Opens/Initializes the photo mode
CameraController.PhotoMode.take_picture()  # Command of photo mode to take a picture

# It would be necessary to close the actual mode and to initialize the alternative mode

CameraController.VideoMode.open()  # Should give a warning/error/closes automatically the PhotoMode
CameraController.VideoMode.take_video()  #  Command of video mode to take a video

Этого можно добиться, манипулируя методом __getattribute__(self, *args, **kwargs) встроенного класса объектов в Python и проверяя (до оценки методов или свойств), активен ли запрошенный режим или нет.

Кто-нибудь знает другой подход к моделированию заявленного поведения? Я провел некоторое исследование по inte rnet, но не нашел лучшего решения для такого рода проблем. Я хотел бы узнать, как реализовать это поведение наиболее распространенным способом. Также приветствуются другие распространенные подходы из других языков программирования, поскольку портируемость кода иногда важна.

1 Ответ

0 голосов
/ 21 февраля 2020

Вы можете использовать __getattr__ для достижения этой цели.

class Controller(object):

    def __init__(self):
        self.mode = None

    def __getattr__(self, item):
        if item in ['PhotoMode', 'VideoMode']:
            self.mode = item
        return self

    def open(self):
        if self.mode is None:
            # code to open all ports
            print("opened all ports")
        elif self.mode == 'PhotoMode':
            # open photo ports / close other ports based on self.mode
            print("photo mode opened")
        elif self.mode == 'VideoMode':
            # open video modes / close other ports based on self.mode
            print("video mode opened")
        else:
            #error
            print("unknown mode")

    def take_picture(self):
        if self.mode != 'PhotoMode':
            #error
            print("wrong mode for photo")
        # take picture
        pass

    def take_video(self):
        if self.mode != 'VideoMode':
            #error
            print("wrong mode for video")
        # take picture
        pass



# Python 3
CameraController = Controller()  # Creates an instance of the controller class 'Controller'
CameraController.open()  # Opens all communication ports and other things
CameraController.PhotoMode.open()  # Opens/Initializes the photo mode
CameraController.PhotoMode.take_picture()  # Command of photo mode to take a picture

# It would be necessary to close the actual mode and to initialize the alternative mode

CameraController.VideoMode.open()  # Should give a warning/error/closes automatically the PhotoMode
CameraController.VideoMode.take_video()  #  Command of video mode to take a video
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...