Python单例模式
# Python单例模式示例1
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
parent = super(Singleton,cls)
cls._instance = parent.__new__(cls, *args, **kwargs)
return cls._instance
class Foo(Singleton):
num = 10
f1 = Foo()
f2 = Foo()
print(id(f1),f1)
print(id(f2),f2)
# Python单例模式示例2
class Singleton(object):
one_instance = None
def __new__(cls, *args, **kwargs):
if not cls.one_instance:
cls.one_instance = super(Singleton,cls).__new__(cls,*args,**kwargs)
return cls.one_instance
f1 = Singleton()
f2 = Singleton()
print(id(f1),f1)
print(id(f2),f2)
Python基于线程安全的单例模式
# 线程安全的单例模式
import threading
class Singleton(object):
INSTANCE = None
lock = threading.RLock()
def __new__(cls):
cls.lock.acquire()
if cls.INSTANCE is None:
cls.INSTANCE = super(Singleton, cls).__new__(cls)
cls.lock.release()
return cls.INSTANCE
if __name__ == '__main__':
a = Singleton()
b = Singleton()
print(id(a))
assert id(a) == id(b)
# 装饰器实现
def make_synchronized(func):
from threading import RLock
func.__lock__ = RLock()
def synced_func(*args, **kws):
with func.__lock__:
return func(*args, **kws)
return synced_func
class Singleton(object):
INSTANCE =None
@make_synchronized
def __new__(cls, *args, **kwargs):
if not cls.INSTANCE:
cls.INSTANCE = super(Singleton,cls).__new__(cls,*args,**kwargs)
return cls.INSTANCE
f1 = Singleton()
f2 = Singleton()
print(id(f1),f1)
print(id(f2),f2)
惰性初始化
参考:https://www.cnblogs.com/xybaby/p/6425735.html
单例模式的实现一般都有两种方式:
要么在调用之前就创建好单例对象(eager way),要么在第一次调用的时候生成单例对象(lazy way)
class eager_meta(type):
def __init__(clz, name, bases, dic):
super(eager_meta, clz).__init__(name, bases, dic)
clz._instance = clz()
class singleton_eager(object):
__metaclass__ = eager_meta
@classmethod
def instance(clz):
return clz._instance
class singleton_lazy(object):
__instance = None
@classmethod
def instance(clz):
if clz.__instance is None:
clz.__instance = singleton_lazy()
return clz.__instance
摘自:wiki
class Fruit:
def __init__(self, item):
self.item = item
class Fruits:
def __init__(self):
self.items = {}
def get_fruit(self, item):
if item not in self.items:
self.items[item] = Fruit(item)
return self.items[item]
if __name__ == '__main__':
fruits = Fruits()
print(fruits.get_fruit('Apple'))
print(fruits.get_fruit('Lime'))
参考:https://stackoverflow.com/questions/6760685/creating-a-singleton-in-python *****