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

Python 当只有一个实例才有意义时,我应该使用类吗?,python,class,oop,object,Python,Class,Oop,Object,我是一个初学者python程序员,致力于基于的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 # t

我是一个初学者python程序员,致力于基于的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."""
        ...
对于我来说,使用类来实现这一点是没有意义的,因为摄影机对象应该只有一个实例。因此,每次向服务器发出请求时,都会毫无理由地创建一个新对象

我已经研究了重构这个的可能方法。到目前为止,我发现:

使用单例类,但在Python中似乎不推荐这样做 将所有内容放在单独的模块中。然后所有的类变量都会变成全局变量,从我所读到的来看,这是不好的
创建一个您希望只有一个实例的类并没有错。类是组织和划分代码的极好方法。您可以使用一个模块来实现这一点,但是如果您正在建模一个实际对象,并且相机看起来确实是一个对象,那么类是完成这项工作的正确工具


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

创建一个您希望只有一个实例的类没有错。类是组织和划分代码的极好方法。您可以使用一个模块来实现这一点,但是如果您正在建模一个实际对象,并且相机看起来确实是一个对象,那么类是完成这项工作的正确工具


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

创建类的一个很好的理由是将所有作为对象属性的方法放在一个地方。这可以完全控制对象可能发生的动态,尤其是当程序增大时。一个引人注目的例子可能是,当您包括(比如)登录到代码中,并在类装饰器内使用@get_logfor get_log包装器方法,而不是类外的所有函数时。此日志记录将提供必要的调试信息


使用类对代码进行模块化可以弥补一个对象内存使用的轻微开销,特别是在长期代码维护、质量和控制非常关键的情况下。

创建类的一个很好的理由是将所有作为对象属性的方法放在一个地方。这可以完全控制对象可能发生的动态,尤其是当程序增大时。一个引人注目的例子可能是,当您包括(比如)登录到代码中,并在类装饰器内使用@get_logfor get_log包装器方法,而不是类外的所有函数时。此日志记录将提供必要的调试信息


使用类对代码进行模块化可以补偿一个对象内存使用的轻微开销,特别是在长期代码维护、质量和控制非常关键的情况下。

类属性在我看来是错误的,应该是实例属性。@Daniel你可能是对的,但在原始代码中是这样写的使用camera模块或camera类主要是个人喜好的问题。除了我们都喜欢上课。如果您将摄影机作为cam导入,则全局var问题并没有那么严重,因为您仍然必须使用模块别名cam来限定var。在我看来,类属性是错误的,应该是实例属性。@Daniel你可能是对的,但在原始代码中是这样写的使用camera模块或camera类主要是个人喜好的问题。除了我们都喜欢上课。如果您将摄影机作为cam导入,则全局var问题并不严重,因为您仍然必须使用模块别名cam来限定var。我理解您的说法,但在这种情况下,摄影机不是我要建模的实际对象。它主要用于包装与我的计算机的webcam@Undead当前位置我想你在吹毛求疵。您仍在为对象建模。它不必是现实世界中的物理对象,即使它看起来是,因为您说过它为您的网络摄像头包装了功能。一个对象只是一个概念性的东西,它有一组与之相关联的行为和属性。。。在这种情况下,对线程等使用类变量合适吗?或者我应该使用实例变量吗?@亡灵:我个人会使用实例变量。我理解你的意思,但在这种情况下,相机不是我想要建模的实际对象。它主要用于包装与我的计算机的webcam@Undead当前位置我想你在吹毛求疵。您仍在为对象建模。它不必是现实世界中的物理对象,即使它看起来是,因为你说过它包含函数
为你的网络摄像头安装了一个新的摄像头。一个对象只是一个概念性的东西,它有一组与之相关联的行为和属性。。。在这种情况下,对线程等使用类变量合适吗?或者我应该使用实例变量吗?@Undead:我个人会使用实例变量。