我有一个类,我使用标准的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__().有没有人有关于如何更好地处理这个问题的想法?
回答第一个问题:单例在 Python 中使用得并不频繁,因为它们并不是真正需要的。
要回答第二个问题:如果您认为您确实需要它们,那么有时会使用一种稍微干净、相似的模式,称为“Borg”,请参阅:Borg 设计模式 如果您只需要在实例之间共享一些属性并且不需要成熟的单例(可以实例化一次)您可以简单地使用类属性,如下所示:
class Foo( object ):
val = ...
def __init__( self ):
...
Run Code Online (Sandbox Code Playgroud)
然后所有实例将共享相同的“val”属性值。
| 归档时间: |
|
| 查看次数: |
223 次 |
| 最近记录: |