Python单例模式的两种实现方法
作者:lqh 时间:2023-03-03 12:31:09
Python单例模式的两种实现方法
方法一
import threading
class Singleton(object):
__instance = None
__lock = threading.Lock() # used to synchronize code
def __init__(self):
"disable the __init__ method"
@staticmethod
def getInstance():
if not Singleton.__instance:
Singleton.__lock.acquire()
if not Singleton.__instance:
Singleton.__instance = object.__new__(Singleton)
object.__init__(Singleton.__instance)
Singleton.__lock.release()
return Singleton.__instance
1.禁用__init__方法,不能直接创建对象。
2.__instance,单例对象私有化。
3.@staticmethod,静态方法,通过类名直接调用。
4.__lock,代码锁。
5.继承object类,通过调用object的__new__方法创建单例对象,然后调用object的__init__方法完整初始化。
6.双重检查加锁,既可实现线程安全,又使性能不受很大影响。
方法二:使用decorator
#encoding=utf-8
def singleton(cls):
instances = {}
def getInstance():
if cls not in instances:
instances[cls] = cls()
return instances[cls]
return getInstance
@singleton
class SingletonClass:
pass
if __name__ == '__main__':
s = SingletonClass()
s2 = SingletonClass()
print s
print s2
也应该加上线程安全
附:性能没有方法一高
import threading
class Sing(object):
def __init__():
"disable the __init__ method"
__inst = None # make it so-called private
__lock = threading.Lock() # used to synchronize code
@staticmethod
def getInst():
Sing.__lock.acquire()
if not Sing.__inst:
Sing.__inst = object.__new__(Sing)
object.__init__(Sing.__inst)
Sing.__lock.release()
return Sing.__inst
来源:http://huaxia524151.iteye.com/blog/1345156
标签:Python,单例模式
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Django实战之用户认证(初始配置)
2022-08-17 22:15:02
PHP程序员最常犯的11个MySQL错误
2012-01-05 19:13:02
MySQL索引数据结构入门详细教程
2024-01-25 02:02:42
![](https://img.aspxhome.com/file/2023/8/65718_0s.png)
段正淳的css笔记(2)圆角的做法
2007-11-01 21:52:00
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2024-04-10 10:56:49
![](https://img.aspxhome.com/file/2023/0/136850_0s.png)
PHP连接MySQL数据的操作要点
2023-06-20 09:31:16
Python如何使用opencv进行手势识别详解
2021-11-06 07:12:23
![](https://img.aspxhome.com/file/2023/5/120365_0s.jpg)
python 读取.csv文件数据到数组(矩阵)的实例讲解
2023-08-10 12:12:36
一篇文章带你搞懂Go语言标准库Time
2024-05-09 09:54:35
Python matplotlib画图实例之绘制拥有彩条的图表
2023-01-26 02:06:25
![](https://img.aspxhome.com/file/2023/8/86268_0s.jpg)
Python源码学习之PyType_Type和PyBaseObject_Type详解
2023-08-03 15:50:05
![](https://img.aspxhome.com/file/2023/3/61733_0s.png)
python使用QQ邮箱实现自动发送邮件
2021-03-03 22:10:06
![](https://img.aspxhome.com/file/2023/4/121854_0s.png)
python 用所有标点符号分隔句子的示例
2022-09-18 01:41:57
Pycharm 文件更改目录后,执行路径未更新的解决方法
2023-06-17 03:33:48
![](https://img.aspxhome.com/file/2023/6/60966_0s.jpg)
python机器学习pytorch 张量基础教程
2023-06-18 04:54:31
![](https://img.aspxhome.com/file/2023/4/65094_0s.png)
Python curses内置颜色用法实例
2021-07-27 02:41:35
django 通过URL访问上传的文件方法
2022-09-02 22:03:59
![](https://img.aspxhome.com/file/2023/0/97190_0s.jpg)
asp如何计算下载一个文件需要多长时间?
2009-11-25 20:17:00
一篇文章带你自学python Django
2023-11-13 20:33:13
![](https://img.aspxhome.com/file/2023/5/124255_0s.png)
Oracle to_char函数的使用方法
2024-01-19 01:47:37