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