Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.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_Singleton - Fatal编程技术网

Python单例设计模式跟踪应用程序统计信息

Python单例设计模式跟踪应用程序统计信息,python,singleton,Python,Singleton,我有一个Python应用程序,它执行任务的工作流。这些任务中的每一个都可能位于其自己的模块中。完成所有任务的列表后,应用程序将关闭。在它关闭之前,我想收集每个任务的相关统计数据 我在考虑使用singleton模式提供一个存储所有这些数据的位置,以便在最后检索它。每个任务将导入singleton stats tracking类,创建一个实例(该类的公共、单个实例)并使用该实例存储任何数据 在我的例子中,我想要一个包来存储每个任务的数据。我一直听说单身汉不好。我想了解有关使用singleton设计模

我有一个Python应用程序,它执行任务的工作流。这些任务中的每一个都可能位于其自己的模块中。完成所有任务的列表后,应用程序将关闭。在它关闭之前,我想收集每个任务的相关统计数据

我在考虑使用singleton模式提供一个存储所有这些数据的位置,以便在最后检索它。每个任务将导入singleton stats tracking类,创建一个实例(该类的公共、单个实例)并使用该实例存储任何数据

在我的例子中,我想要一个包来存储每个任务的数据。我一直听说单身汉不好。我想了解有关使用singleton设计模式或任何其他建议的信息

单身汉是否“坏”似乎是品味的问题。当然,他们有自己的位置,任何关于单身主题的变化都应该适合你

自Alex Martelli的聪明的ActiveState配方以来,“Borg模式”(不太鲜艳,也不太常见,“无状态代理”或“Monostate”)一直是Singleton的流行Python替代品。它不同于Singleton,它允许一个类的多个不同对象共享公共数据。相比之下,Singleton模式确保只创建一个类的实例

关于Borg vs Singleton问题的讨论可以在以下stackoverflow帖子中找到:。由于缺少
\u init\u default\u register
方法,本文顶部的实现可能令人费解,该方法的目的是创建和初始化公共数据属性,只需一次。为了便于参考和比较,以下是完整的实现(在Python 3中),它们都创建了一个数据属性(一个名为
data
)的dict):

Python中实现单例的标准方法是使用元类

class Singleton(type):
    def __init__(cls, *args, **kwargs):
        cls.__instance = None
        super().__init__(*args, **kwargs)

    def __call__(cls, *args, **kwargs):
        if cls.__instance is None:
            cls.__instance = super().__call__(*args, **kwargs)
        return cls.__instance
通过赋予统计跟踪类以下元类,可以使其成为单例:

class StatsTrackerSingleton(metaclass=Singleton):
    def __init__(self):
        self.data = {}

    # ... methods to update data, summarize it, etc. ...
Borg模式更易于实现,而且由于它不使用元类,因此可能更灵活:

class StatsTrackerBorg():
    __shared_data = {'data':{}}
    # RHS guarantees a common dict named `data`

    def __init__(self):
        """Make every instance use StatsTrackerBorg.__shared_data
        for its attribute dict."""
        self.__dict__ = self.__shared_data

    # ... methods to update data, summarize it, etc. ...
对于上述两种模式,您可以使用公共dict
数据
,并且您可以使用点运算符简单地获取和设置共享属性。例如,使用Borg类:

>>> a = StatsTrackerBorg()
>>> b = StatsTrackerBorg()
>>> a is b          # would be True for StatsTrackerSingleton
False
>>> vars(a) is vars(b)
True

>>> vars(a)
{'data': {}}
>>> a.data['running_time'] = 10000
>>> b.bar = 10
>>> vars(a)
{'data': {'running_time': 10000}, 'bar': 10}

>>> b.foo = 'y'
>>> a.foo
'y'

这两种模式之间的一个值得注意的区别是:“Borg’ed”类的子类与超类共享相同的公共状态,并且仍然可以添加更多可访问其实例的共享状态,而Singleton类的每个子类都有自己独特的实例,从而有自己的公共状态,与超类的公共状态不相交。对于某些预期的应用,其中一种行为显然比另一种更合适。

为什么不使用字典呢?