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 相关文章推荐
使用70行Python代码实现一个递归下降解析器的教程
Apr 17 Python
浅谈Python中的数据类型
May 05 Python
详解Python中的条件判断语句
May 14 Python
python绘制直线的方法
Jun 30 Python
numpy的文件存储.npy .npz 文件详解
Jul 09 Python
python3 拼接字符串的7种方法
Sep 12 Python
python 循环读取txt文档 并转换成csv的方法
Oct 26 Python
浅谈python中真正关闭socket的方法
Dec 18 Python
tensorflow实现从.ckpt文件中读取任意变量
May 26 Python
Python大批量搜索引擎图像爬虫工具详解
Nov 16 Python
Django通过设置CORS解决跨域问题
Nov 26 Python
python 实现百度网盘非会员上传超过500个文件的方法
Jan 07 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调用三种数据库的方法(3)
2006/10/09 PHP
PHP执行linux系统命令的常用函数使用说明
2010/04/27 PHP
深入解析PHP中逗号与点号的区别
2013/08/05 PHP
windows服务器中检测PHP SSL是否开启以及开启SSL的方法
2014/04/25 PHP
php注册和登录界面的实现案例(推荐)
2016/10/24 PHP
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
一些主流JS框架中DOMReady事件的实现小结
2011/02/12 Javascript
JS图像无缝滚动脚本非常好用
2014/02/10 Javascript
使用jQuery异步加载 JavaScript脚本解决方案
2014/04/20 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
js数组实现权重概率分配
2017/09/12 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
2018/06/06 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
2018/08/31 Javascript
深入理解vue中的slot与slot-scope
2019/04/22 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
2019/07/10 Javascript
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
Vue如何实现验证码输入交互
2020/12/07 Vue.js
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
Python模拟登陆实现代码
2017/06/14 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
Python实现matplotlib显示中文的方法详解
2018/02/06 Python
Python 获取中文字拼音首个字母的方法
2018/11/28 Python
python中 * 的用法详解
2019/07/10 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
2019/12/12 Python
python ETL工具 pyetl
2020/06/07 Python
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
主持词开场白
2014/03/17 职场文书
保护野生动物倡议书
2014/05/16 职场文书
咖啡店创业计划书
2014/08/15 职场文书
本科毕业论文导师评语
2014/12/31 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
Python读写yaml文件
2022/03/20 Python
ipad隐藏软件app图标方法
2022/04/19 数码科技
el-form每行显示两列底部按钮居中效果的实现
2022/08/05 HTML / CSS