VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > 简明python教程 >
  • Python中的单例模式如何正确运用?本文详解(2)

上述代码中通过threading.Lock()将单例化方法同步化,这样在面对多个线程时也不会出现创建多个实例的情况,可以简单试验一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def worker():
    s = Singleton()
    print(id(s))
 
def test():
    task = []
    for i in range(10):
        t = threading.Thread(target=worker)
        task.append(t)
    for i in task:
        i.start()
    for i in task:
        i.join()
 
test()

运行后,打印的单例的id都是相同的。

更优的方法

加了同步锁之后,除了无法传入参数外,已经没有什么大问题了,但是否有更优的解决方法呢?单例模式是否有可以接受参数的实现方式?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def singleton(cls):
    cls.__new_original__ = cls.__new__
 
    @functools.wraps(cls.__new__)
    def singleton_new(cls, *args, **kwargs):
        it = cls.__dict__.get('__it__')
        if it is not None:
            return it
        
        cls.__it__ = it = cls.__new_original__(cls, *args, **kwargs)
        it.__init_original__(*args, **kwargs)
        return it
 
    cls.__new__ = singleton_new
    cls.__init_original__ = cls.__init__
    cls.__init__ = object.__init__
    return cls
    
@singleton
class Foo(object):
    def __new__(cls, *args, **kwargs):
        cls.x = 10
        return object.__new__(cls)
 
    def __init__(self, x, y):
        assert self.x == 10
        self.x = x
        self.y = y

相关教程