您的位置:首页 > 编程语言 > Python开发

python中的四种单例模式

2020-02-17 04:09 337 查看
1 # 单例模式:无法支持多线程情况
2 """
3 class Singleton(object):
4     def __init__(self):
5         import time
6         time.sleep(1)
7     @classmethod
8     def instance(cls, *args, **kwargs):
9         if not hasattr(Singleton, "_instance"):
10             Singleton._instance = Singleton(*args, **kwargs)
11         return Singleton._instance
12 import threading
13
14 def task(arg):
15     obj = Singleton.instance()
16     print(obj)
17
18 for i in range(10):
19     t = threading.Thread(target=task,args=[i,])
20     t.start()
第一种
1 import time
2 import threading
3 class Singleton(object):
4     _instance_lock = threading.Lock()
5     def __init__(self):
6         time.sleep(4)
7     @classmethod
8     def instance(cls, *args, **kwargs):
9         if not hasattr(Singleton, "_instance"):
10             with Singleton._instance_lock:
11                 if not hasattr(Singleton, "_instance"):
12                     Singleton._instance = Singleton(*args, **kwargs)
13         return Singleton._instance
14 def task(arg):
15     obj = Singleton.instance()
16     print(obj)
17 for i in range(10):
18     t = threading.Thread(target=task,args=[i,])
19     t.start()
20 obj = Singleton.instance()
21 print(obj)
第二种
1 import time
2 import threading
3 class Singleton(object):
4     _instance_lock = threading.Lock()
5     def __init__(self):
6         pass
7     def __new__(cls, *args, **kwargs):
8         if not hasattr(Singleton, "_instance"):
9             with Singleton._instance_lock:
10                 if not hasattr(Singleton, "_instance"):
11                     Singleton._instance = object.__new__(cls, *args, **kwargs)
12         return Singleton._instance
13 obj1 = Singleton()
14 obj2 = Singleton()
15 print(obj1,obj2)
第三种
1 import threading
2 class SingletonType(type):
3     _instance_lock = threading.Lock()
4     def __call__(cls, *args, **kwargs):
5         if not hasattr(cls, "_instance"):
6             with SingletonType._instance_lock:
7                 if not hasattr(cls, "_instance"):
8                     cls._instance = super(SingletonType,cls).__call__(*args, **kwargs)
9         return cls._instance
10 class Foo(metaclass=SingletonType):
11     def __init__(self,name):
12         self.name = name
13 obj1 = Foo('name')
14 obj2 = Foo('name')
15 print(obj1,obj2)
第四种

 

 

转载于:https://www.cnblogs.com/sxh-myblogs/p/8244813.html

    20000
  • 点赞
  • 收藏
  • 分享
  • 文章举报
aocheng1010 发布了0 篇原创文章 · 获赞 0 · 访问量 99 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: