Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—具有不同操作模式的设备模型_Python_Oop_Model_State - Fatal编程技术网

Python—具有不同操作模式的设备模型

Python—具有不同操作模式的设备模型,python,oop,model,state,Python,Oop,Model,State,我对Python中的设备建模感兴趣。让我们以具有两种不同操作模式的相机为例,即。E照片模式和视频模式。通常,当视频模式处于活动状态时,不应调用来自照片模式的方法,反之亦然。即。在照片模式中,不能从视频模式更改帧速率(fps) 在限制访问其他模式的情况下实现此设备的一个想法是创建一个控制器类,用于管理摄像机内组件之间的通信(打开/关闭串行端口,执行硬件测试等)。在控制器类中,实现的模式(照片模式和视频模式)可以分配给控制器,而这些模式可以实现为自己的类/库 有效的命令集可以是: # Python

我对Python中的设备建模感兴趣。让我们以具有两种不同操作模式的相机为例,即。E照片模式和视频模式。通常,当视频模式处于活动状态时,不应调用来自照片模式的方法,反之亦然。即。在照片模式中,不能从视频模式更改帧速率(fps)

在限制访问其他模式的情况下实现此设备的一个想法是创建一个控制器类,用于管理摄像机内组件之间的通信(打开/关闭串行端口,执行硬件测试等)。在控制器类中,实现的模式(照片模式和视频模式)可以分配给控制器,而这些模式可以实现为自己的类/库

有效的命令集可以是:

# 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
可以通过操纵Python中内置对象类的
\uuuu getattribute\uuuu(self,*args,**kwargs)
方法来实现此行为,并检查(在计算方法或属性之前)请求的模式是否处于活动状态


有人知道对所述行为建模的不同方法吗?我在互联网上做了一些研究,但没有找到更好的解决此类问题的方法。我想学习如何以最常见的方式实施这种行为。另外,其他编程语言的其他常用方法也很受欢迎,因为代码可移植性有时很重要。

您可以使用
\uuu getattr\uuu
来实现这一点

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

建议的解决方案很有趣。有一些事情我想避免:-不同的模式不是作为类实现的(字符串用于区分它们)因此,代码维护更加困难——每个命令都必须显式地使用if-else子句来检查是否可以执行相应的方法是否有更复杂的策略来解决这个问题?