#装饰器实现单例模式def singleton1(func): instance={} def inner(*args,**kwargs): if func not in instance: instance[func]=func(*args,**kwargs) return instance[func] return inner@singleton1class user(): passfoo1=user()foo2=user()print(foo1 is foo2)
#使用修改基类实现单例模式class Singleton2(): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = super().__new__(cls, *args, **kwargs) return cls._instanceclass Foo(Singleton2): passfoo3 = Foo()foo4 = Foo()print( foo3 is foo4)
#使用类实现单例模式,配合多线程import threadingimport timeclass Singleton(object): _lock=threading.Lock() def __init__(self): time.sleep(1) @classmethod def instance(cls, *args, **kwargs): if not hasattr(Singleton, "_instance"): with Singleton._lock: if not hasattr(Singleton, "_instance"): Singleton._instance = Singleton(*args, **kwargs) return Singleton._instancedef task(arg): obj = Singleton.instance() print(obj)for i in range(10): t = threading.Thread(target=task,args=[i,]) t.start()time.sleep(20)obj=Singleton.instance()print(obj)
#使用元类实现单例模式class SingletonType(type): _instance_lock = threading.Lock() def __call__(cls, *args, **kwargs): if not hasattr(cls, "_instance"): with SingletonType._instance_lock: if not hasattr(cls, "_instance"): cls._instance = super(SingletonType,cls).__call__(*args, **kwargs) return cls._instanceclass Foo(metaclass=SingletonType): def __init__(self,name): self.name = nameobj1 = Foo('name')obj2 = Foo('name')print(obj1 is obj2)