我遇到的情况是我必须确保只有一个物体。我正在考虑实施单身如下:
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
由于我正在阅读很多关于单身人士(利弊)的内容,所以我对实施这段代码犹豫不决。我想知道在需要(或强制)只有一个特定类别的对象的情况下使用它是否合适和/或被认为是良好做法。
有没有更好的方法来实现同样的事情?
答案 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