Python单例模式的两种实现方法


Posted in Python onAugust 14, 2017

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

以上就是Python单例模式的实例详解,如有疑问请留言或者到本站的社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
Python解释执行原理分析
Aug 22 Python
Python中for循环和while循环的基本使用方法
Aug 21 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
Aug 30 Python
python虚拟环境virtualenv的安装与使用
Sep 21 Python
JSON文件及Python对JSON文件的读写操作
Oct 07 Python
11个Python3字典内置方法大全与示例汇总
May 13 Python
Python使用正则表达式分割字符串的实现方法
Jul 16 Python
浅析python标准库中的glob
Mar 13 Python
python使用多线程+socket实现端口扫描
May 28 Python
python3处理word文档实例分析
Dec 01 Python
利用Pycharm连接服务器的全过程记录
Jul 01 Python
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
Apr 14 Python
Python基于Matplotlib库简单绘制折线图的方法示例
Aug 14 #Python
python使用super()出现错误解决办法
Aug 14 #Python
Python SQLite3数据库日期与时间常见函数用法分析
Aug 14 #Python
python itchat实现微信自动回复的示例代码
Aug 14 #Python
Python编程实现控制cmd命令行显示颜色的方法示例
Aug 14 #Python
django 创建过滤器的实例详解
Aug 14 #Python
django创建自定义模板处理器的实例详解
Aug 14 #Python
You might like
用PHP的ob_start() 控制您的浏览器cache
2009/08/03 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码
2014/09/04 PHP
smarty模板引擎从php中获取数据的方法
2015/01/22 PHP
php实现分页显示
2015/11/03 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
js读取本地excel文档数据的代码
2010/11/11 Javascript
js封装的textarea操作方法集合(兼容很好)
2010/11/16 Javascript
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
使用js简单实现了tree树菜单
2013/11/20 Javascript
chrome下jq width()方法取值为0的解决方法
2014/05/26 Javascript
基于javascript实现彩票随机数生成(简单版)
2020/04/17 Javascript
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
2016/03/25 Javascript
JS生成和下载二维码的代码
2016/12/07 Javascript
AngularJS折叠菜单实现方法示例
2017/05/18 Javascript
vue组件 $children,$refs,$parent的使用详解
2017/07/31 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
详解JS实现系统登录页的登录和验证
2019/04/29 Javascript
使用layui 的layedit定义自己的toolbar方法
2019/09/18 Javascript
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
2020/12/01 Vue.js
[05:37]DOTA2-DPC中国联赛 正赛 Elephant vs iG 选手采访
2021/03/11 DOTA
Python对象的属性访问过程详解
2020/03/05 Python
Jupyter notebook 远程配置及SSL加密教程
2020/04/14 Python
Python环境管理virtualenv&virtualenvwrapper的配置详解
2020/07/01 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
纯HTML5+CSS3制作生日蛋糕(代码易懂)
2016/11/16 HTML / CSS
Hotels.com中国区:好订网
2016/08/18 全球购物
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
元旦促销方案
2014/03/15 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
经贸日语专业自荐信
2014/09/02 职场文书
祝福语集锦:给满月宝宝的祝福语
2019/11/20 职场文书
三年级作文之小小梦想
2019/12/06 职场文书
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android