单例
所谓单例,就是在任何地方构造的类的实例都是同一个。实现单例类的思路就是在类的构造方法中保存已经构造的实例,如果再次构造,返回已经构造的那个实例即可。
线程安全
线程安全就是防止一个线程在构造实例时,被另外一个线程给同时修改了。实现线程安全的最简单的办法就是加锁。
所以最简单的实现方式如下:
# 加锁,实现线程安全
def synchronized(func):
"""
Decorator in order to achieve thread-safe singleton class.
"""
func.__lock__ = threading.Lock()
def lock_func(*args, **kwargs):
with func.__lock__:
return func(*args, **kwargs)
return lock_func
class SingleInstanceMetaClass(type):
# 保存已经构造过的实例
instance = None
def __init__(cls, *args, **kwargs):
super().__init__(*args, **kwargs)
def __call__(cls, *args, **kwargs):
if cls.instance:
return cls.instance
cls.instance = cls.__new__(cls)
cls.instance.__init__(*args, **kwargs)
return cls.instance
@synchronized
def __new__(cls, *args, **kwargs):
return super().__new__(cls, *args, **kwargs)
class SingleInstance(Object):
def __init__:
"""
Do what you want to do.
"""