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迭代器实例简析
Sep 25 Python
Python增量循环删除MySQL表数据的方法
Sep 23 Python
python模块之sys模块和序列化模块(实例讲解)
Sep 13 Python
Python基于OpenCV实现视频的人脸检测
Jan 23 Python
python发送邮件脚本
May 22 Python
Python wxPython库消息对话框MessageDialog用法示例
Sep 03 Python
Django如何简单快速实现PUT、DELETE方法
Jul 24 Python
Python 用matplotlib画以时间日期为x轴的图像
Aug 06 Python
使用Python函数进行模块化的实现
Nov 15 Python
Python 3.8 新功能大揭秘【新手必学】
Feb 05 Python
Python 多线程共享变量的实现示例
Apr 17 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 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 function用法如何递归及return和echo区别
2014/03/07 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
Laravel框架实现的记录SQL日志功能示例
2018/06/19 PHP
再说AutoComplete自动补全之实现原理
2011/11/05 Javascript
IE6下opacity与JQuery的奇妙结合
2013/03/01 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
2014/11/08 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
2015/04/30 Javascript
JS实现黑色风格的网页TAB选项卡效果代码
2015/10/09 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
AngularJS路由切换实现方法分析
2017/03/17 Javascript
详解js跨域请求的两种方式,支持post请求
2018/05/05 Javascript
vue封装一个简单的div框选时间的组件的方法
2019/01/06 Javascript
浅谈Webpack多页应用HMR卡住问题
2019/04/24 Javascript
JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
2019/08/16 Javascript
Vue 刷新当前路由的实现代码
2019/09/26 Javascript
js实现简单掷骰子效果
2019/10/24 Javascript
javaScript中indexOf用法技巧
2019/11/26 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
Vue+Java+Base64实现条码解析的示例
2020/09/23 Javascript
paramiko模块安装和使用(远程登录服务器)
2014/01/27 Python
python监控网站运行异常并发送邮件的方法
2015/03/13 Python
Python+django实现文件上传
2016/01/17 Python
Python科学计算之Pandas详解
2017/01/15 Python
Python编程生成随机用户名及密码的方法示例
2017/05/05 Python
Python实现登录接口的示例代码
2017/07/21 Python
Python流程控制常用工具详解
2020/02/24 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
eDreams巴西:廉价机票,酒店优惠和度假套餐
2017/04/14 全球购物
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
.NET面试题:什么是反射
2016/09/30 面试题
团队经理竞聘书
2014/03/31 职场文书
《故乡》教学反思
2014/04/10 职场文书
三八红旗集体先进事迹材料
2014/05/22 职场文书
房产协议书范本
2014/10/18 职场文书
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技