Singleton-python,只需要一个对象的情况

时间:2016-01-20 21:11:16

标签: python design-patterns

我遇到的情况是我必须确保只有一个物体。我正在考虑实施单身如下:

class One_Of_a_Kind:
    def __init__(self):
        self.do_some_setup()


class One_Creator:
    Only_One = None
    def __new__(cls, *args, **kwargs):
        if One_Creator.Only_One:
            return One_Creator.Only_One
        else:
            One_Creator.Only_One = One_of_a_Kind()
            return One_Creator.Only_One

由于我正在阅读很多关于单身人士(利弊)的内容,所以我对实施这段代码犹豫不决。我想知道在需要(或强制)只有一个特定类别的对象的情况下使用它是否合适和/或被认为是良好做法。

有没有更好的方法来实现同样的事情?

2 个答案:

答案 0 :(得分:5)

更好的方法是Borg设计模式。在python中实现起来非常简单:

class Borg:

    _shared_state = {}

    def __init__(self):
        self.__dict__ = self._shared_state

您实际上并没有单个实例,但每个实例共享相同的状态 - 这是重要的部分。

答案 1 :(得分:2)

何时以及如何使用单身人士是一个相当广泛的问题,主要是基于意见。话虽如此,我会像这样实现它:

class Singleton(object):
    state = {}
    def __init__(self):
        self.__dict__ = Singleton.state

这个想法取自here。这是一种伪单例,因为两个实例不会共享相同的id:

>>> s1 = Singleton()
>>> s2 = Singleton()
>>> s1 is s2
False
>>> s1.x = 42
>>> s2.x
42