当只有一个实例才有意义时,我应该使用一类吗?

时间:2019-02-04 18:41:19

标签: python class oop object

我是Pythoon初级程序员,致力于基于this tutorial的Flask视频服务器的设置。我有问题的一点代码用于初始化计算机网络摄像头并输出帧:

class Camera(object):
    thread = None  # background thread that reads frames from camera
    frame = None  # current frame is stored here by background thread
    last_access = 0  # time of last client access to the camera
    start_time = 0  # time at which the camera is started

    def __init__(self):
        """Start the background camera thread if it isn't running yet."""
        ...

    def get_frame(self):
        """Return the current camera frame."""
        ...

    @staticmethod
    def frames():
        """"Generator that returns frames from the camera."""
        ...

    @classmethod
    def _thread(cls):
        """Camera background thread."""
        ...

使用一个类对此没有意义,因为应该只有Camera对象的一个​​实例。因此,每次向服务器发出请求时,都会无缘无故地创建一个新对象。

我研究了重构的可能方法。到目前为止,我发现了什么:

  • 使用单例类,但在Python中似乎不建议使用
  • 将所有内容放在单独的模块中。然后所有的类变量都将变成全局变量,这对我所读的内容来说是不好的

2 个答案:

答案 0 :(得分:5)

创建您希望为其具有单个实例的类没有错。类是一种组织和分隔代码的绝妙方法。您可以为此使用模块,但是如果您要为实际对象建模(并且“相机”当然似乎是对象),则类是完成任务的正确工具。

此外,使用类使测试代码更加容易,因为您可以在测试用例中导入类并在程序本身之外与之交互。

答案 1 :(得分:2)

创建类的一个很好的理由是将所有方法(将用作对象的属性)放在一个位置。这可以完全控制对象可能发生的动态,尤其是在程序大小增加时。一个有说服力的例子是,当您说出代码时,登录并在类之外的所有函数上方使用@get_log(用于类内部的get_log()包装器方法)修饰符。此日志记录将提供必要的调试信息。

使用类对代码进行模块化可以补偿一个对象的内存使用量带来的少量开销,尤其是在长期代码维护,质量和控制是关键的情况下。