这个单身人士出了什么问题?

时间:2011-08-26 15:49:29

标签: python singleton

目前我正在使用一个相当简单的单例实现。但是,我从来没有在网上看到过这样的建议,这让我觉得它可能有问题......

class Singleton:
    def __init__():
        raise ...

    @staticmethod
    def some():
        pass

    @staticmethod
    def another():
        pass

单例的这种实现是否有任何缺点(使所有类成员都是静态的)。它有点类似于使用模块作为单例,除了你把所有东西都包装在一个类中。


编辑:我知道other ways在Python中实现单例。我不喜欢它们的是它们都不是明确的(这与Python zen相反):

由于我a = Class()而不是像a = Class.Instance()这样的东西,所以我处理具有共享状态的对象并不明显(参见注释#1)。如果所有成员都是静态的,我至少有Class.someMethod()哪种类型表明它是单身。我不喜欢这种方法的是你不能使用构造函数和析构函数,它消除了单例对自由函数的主要优势,这是你在创建和销毁它们时可以做的事情(参见注释#2)

注意#1:我知道我不应该关心单身人士的状态(如果我这样做,那么它首先不应该是单身人士)。我仍然希望明确它是什么类。

注意#2:创建单例时,可以在其构造函数中进行一些实例化。例如,在处理图形库的单例中,您可以在constrctor中初始化库。这种方式实例化和解除实例在sinleton的构造函数和析构函数中自动发生 或者在ResourceManager中:析构函数可以检查在销毁时是否仍有内存中的资源并采取相应的行动 如果你使用自由函数而不是单例,你必须手工完成所有这些。

5 个答案:

答案 0 :(得分:11)

是的,这是一个单身人士,这就是它的错误。如果您要将所有方法设置为静态,请不要费心去创建类,只需使用自由函数。

答案 1 :(得分:2)

那不是单身人士。它是一个无状态的全局方法集合,包含在一个类型中。

除非你认为它是单身人士,否则没有任何内在错误。

Singleton仅表示一个实例。

答案 2 :(得分:1)

模仿是不可能的,所以很难测试。

这就是它的错误。

实际上有一个可测试类的1个对象被认为是更好的练习。

答案 3 :(得分:1)

我们是博格! 这种状态在对象的每个实例之间共享。

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

a = Borg()
a.a = 34
b = Borg()
print b.a
c = Borg()
c.c = "haha"
print a.c

引用original

答案 4 :(得分:1)

单例是一个类,每次调用构造函数时都会创建相同的实例。你的类没有构造函数,所以它不能是单例。

borg模式是不同的,这里每个实例共享相同的属性。博格模式的发明者亚历克斯·马尔泰利(Alex Martelli)在2011年欧洲锦标赛上发表了一篇演讲,他告诉Guido van Russom不喜欢博格模式,但他没有说明原因。

python中的一个真正的单例有两个优点:

  1. 你可以从中继承
  2. 如果您重构代码并决定需要不同的实例,则代码更改将最小化。