Python单例模式

2024-05-23 18:26:32 发布

您现在位置:Python中文网/ 问答频道 /正文

有人可以告诉我为什么作为单例模式这是不正确的:

class preSingleton(object):
    def __call__(self):
        return self

singleton = preSingleton()

# singleton is actually the singleton

a = singleton()
b = singleton()

print a==b  

a.var_in_a = 100
b.var_in_b = 'hello'

print a.var_in_b
print b.var_in_a

编辑:打印上述代码:

^{pr2}$

非常感谢

第二部分

也许这样更好?在

class Singleton(object):
    def __new__(cls):
        return cls

a = Singleton()
b = Singleton()

print a == b

a.var_in_a = 100
b.var_in_b = 'hello'

print a.var_in_b
print b.var_in_a

编辑:打印上述代码:

^{pr2}$

再次感谢。在


Tags: 代码inself编辑helloreturnobjectvar
2条回答

因为这不是单身汉。单身汉必须是单身,你的对象不是单身。在

>>> class preSingleton(object):
...     def __call__(self):
...         return self
...
>>> singleton = preSingleton()
>>> singleton2 = preSingleton()
>>> singleton
<__main__.preSingleton object at 0x00C6D410>
>>> singleton2
<__main__.preSingleton object at 0x00C6D290>

在Python中,单例实际上非常简单。诀窍是让模块为您进行封装,而不是生成类。在

  • 模块只初始化一次
  • 模块在第一次导入之前不会初始化
  • 任何重新导入模块的尝试都将返回指向现有导入的指针

如果你想假装这个模块是一个类的一个实例,你可以做如下的事情

import some_module
class SomeClass(object):
    def __init__(self):
        self.singleton = some_module

这实际上是柏格人的模式。共享状态的多个对象。在

这并不是说它有任何问题,而且对于大多数用例,如果不是所有用例,它在功能上等同于单例实例,但是既然您问了。。。在

编辑:当然,由于它们是Borg对象,每个实例都会占用更多的内存,因此如果你要创建大量的实例,这将对资源使用产生影响。在

相关问题 更多 >