Python单例模式

1.装饰器实现单例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def singleton(cls):
instances = {}
def getinstance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return getinstance

class parent(object):
pass

@singleton
class child(parent):
pass

注意:

被装饰的类无法被继承,只能装饰子类

2.__new__实现单例:

1
2
3
4
5
6
7
8
9
10
11
12
class singleton(object):
instances = {}
instances_lock = threading.Lock()
def __new__(cls,*args,**kw):
if cls in cls.instances:
return cls.instances[cls]
with cls.instances_lock:
if cls in cls.instances:
return cls.instances[cls]
cls.instances[cls] = super(singleton, cls).__new__(cls,*args,**kw)
class child(singleton):
pass

注意:

1.如果子类有__init__()方法,那么每次实例化时,__init__()都会被调用
2.如果子类有__new__()方法,那么每次实例化时,都会只会调用子类__new__(),
  只能手动调用父类__new__()方法(super(singleton, cls).__new__(cls,*args,**kw))