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
编辑:上面的代码输出:
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