Python 单例模式

3 投票
6 回答
2290 浏览
提问于 2025-04-15 23:57

有人能告诉我为什么这个代码在单例模式下是不正确的吗:

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

编辑:上面的代码输出:

True
hello
100

非常感谢

第二部分

也许这个更好一些?

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

编辑:上面的代码输出:

True
hello
100

再次感谢。

6 个回答

2

这实际上是博格模式。就是多个对象共享同一个状态。

这并不是说这样做有什么问题,对于大多数情况下,它的功能和单例模式是一样的,但既然你问了...

补充一下:当然,由于这些是博格对象,每个实例会占用更多的内存,所以如果你创建了很多这样的对象,资源使用上就会有差别。

3

因为这不是一个单例模式。单例模式要求只有一个实例,而你的对象并不是这样。

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

在Python中,单例模式其实很简单。关键在于让模块自己帮你封装,而不是创建一个类。

  • 这个模块只会被初始化一次
  • 这个模块在第一次被导入之前不会被初始化
  • 如果你尝试重新导入这个模块,它会返回一个指向已经导入的模块的引用

如果你想让这个模块看起来像是一个类的实例,你可以这样做:

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

撰写回答