单例模式
1.基于文件
(1)db.py class Foo(object): def __init__(self): self.conn = "连接数据库" pass def get(self): self.conn obj = Foo() (2)views.py print(db.obj) (3)run.py import db import views print(db.obj) #只创建一次对象
2.基于@classmethod
示例: import threading import time class Foo(object): instance=None lock=threading.Lock() #线程保护,加锁 def __init__(self): self.a1=1 time.sleep(1) @classmethod def get_instance(cls,*args,**kwargs): if not cls.instance: with cls.lock: if not cls.instance: obj=cls(*args,**kwargs) cls.instance=obj return cls.instance return cls.instance def task(): m = Foo.get_instance() print(m) for i in range(5): t=threading.Thread(target=task,) t.start()
3.基于__new__
示例: import threading class Foo(object): instance=None lock=threading.Lock() def __init__(self): self.a=1 import time time.sleep(2) def __new__(cls, *args, **kwargs): if not cls.instance: with cls.lock: if not cls.instance: obj=super(Foo,cls).__new__(cls, *args, **kwargs) cls.instance=obj return cls.instance return cls.instance def task(): obj=Foo() print(obj) for i in range(5): t=threading.Thread(target=task,) t.start()
4.基于metaclass
import threading class Singleton(type): lock=threading.Lock() def __call__(cls, *args, **kwargs): if not hasattr(cls,'instance'): with cls.lock: if not hasattr(cls,'instance'): obj=cls.__new__(cls, *args, **kwargs) obj.__init__(*args,**kwargs) setattr(cls,'instance',obj) return getattr(cls,'instance') return getattr(cls,'instance') class Foo(object,metaclass=Singleton): def __init__(self): self.name='aa' obj1=Foo() obj2=Foo() print(obj1,obj2)

浙公网安备 33010602011771号