在__new__中进行初始化工作是"原罪"吗?如果是这样,那么如何最好地处理单例初始化运行?

Sil*_*Ray 5 python

我有一个类,我使用标准的python单例形式.它也只是一个值,但不是在每个实例中初始化它,我在__new__()执行单例处理时启动它.这是pythonic方式吗?如果没有,我还能怎么做?

class Foo(object):
    _inst = None
    def __new__(cls, val):
        if Foo._inst is None:
            Foo._inst = super(Foo, self).__new__(cls)
            Foo._inst.val = val
        return Foo._inst
Run Code Online (Sandbox Code Playgroud)

这显然是简化形式.我已经使用了等待直到__init__()检查的结构并设置Foo._inst为一个单独的初始化处理运行,但在多线程情况下这似乎已经成熟同步错误.对于在现有实例中没有可能被损坏的值的情况如果__init__()再次运行,将init放入其中是没有害处的__init__(),除了你运行的代码在你不需要的时候实际上什么都不做,但是那里通常是腐败的状态值,我不想覆盖.我知道单身人士也是邪恶的,但有时候,他们是最好的解决方案(比如定义我希望能够检查的特殊用途类型is).

这似乎是我能想到的最好的解决方案,但我觉得初始化实例值很脏__new__().有没有人有关于如何更好地处理这个问题的想法?

kgr*_*kgr 2

回答第一个问题:单例在 Python 中使用得并不频繁,因为它们并不是真正需要的。

要回答第二个问题:如果您认为您确实需要它们,那么有时会使用一种稍微干净、相似的模式,称为“Borg”,请参阅:Borg 设计模式 如果您只需要在实例之间共享一些属性并且不需要成熟的单例(可以实例化一次)您可以简单地使用类属性,如下所示:

class Foo( object ):
    val = ...

    def __init__( self ):
        ...
Run Code Online (Sandbox Code Playgroud)

然后所有实例将共享相同的“val”属性值。

  • @sr2222:如果您认为您的示例过于简单化,您可以[编辑](http://stackoverflow.com/posts/9537617/edit)您的问题并更新/改进/添加更多有用的信息。在那里说明您的要求和您的实际代码,这样我们才能真正帮助您/告诉您是否有问题。 (2认同)