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))