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生成指定长度的随机数密码
Jan 23 Python
python网页请求urllib2模块简单封装代码
Feb 07 Python
Python进行数据提取的方法总结
Aug 22 Python
解决Python requests 报错方法集锦
Mar 19 Python
Python实现输出程序执行进度百分比的方法
Sep 16 Python
详解Python打包分发工具setuptools
Aug 05 Python
Python实现基于socket的udp传输与接收功能详解
Nov 15 Python
对Python中 \r, \n, \r\n的彻底理解
Mar 06 Python
python如何调用字典的key
May 25 Python
python怎么调用自己的函数
Jul 01 Python
浅谈matplotlib默认字体设置探索
Feb 03 Python
python 爬取天气网卫星图片
Jun 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
codeigniter中view通过循环显示数组数据的方法
2015/03/20 PHP
PHP+MySQL实现无极限分类栏目的方法
2015/12/23 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
/etc/php-fpm.d/www.conf 配置注意事项
2017/02/04 PHP
神奇的代码 通杀各种网站-可随意修改复制页面内容
2008/07/17 Javascript
JS在IE和FireFox之间常用函数的区别小结
2010/03/12 Javascript
js遍历td tr等html元素
2012/12/13 Javascript
JavaScript中操作字符串小结
2015/05/04 Javascript
JavaScript实现非常简单实用的下拉菜单效果
2015/08/27 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
用js屏蔽被http劫持的浮动广告实现方法
2017/08/10 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
2017/08/17 Javascript
javascript按钮禁用和启用的效果实例代码
2017/10/29 Javascript
安装vue-cli的简易过程
2018/05/22 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
vue实现菜单切换功能
2019/05/08 Javascript
微信小程序云开发之使用云存储
2019/05/17 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
Python 元类使用说明
2009/12/18 Python
基于python编写的微博应用
2014/10/17 Python
python中self原理实例分析
2015/04/30 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
2018/04/19 Python
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
Python Selenium参数配置方法解析
2020/01/19 Python
CSS3提交意见输入框样式代码
2014/10/30 HTML / CSS
一款纯css3实现的响应式导航
2014/10/31 HTML / CSS
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
移动端html5模拟长按事件的实现方法
2018/09/30 HTML / CSS
《我为你骄傲》教学反思
2014/02/20 职场文书
临床医师个人自我评价
2014/04/06 职场文书
职位说明书范文
2014/05/07 职场文书
2019各种保证书范文
2019/06/24 职场文书
教你解决往mysql数据库中存入汉字报错的方法
2021/05/06 MySQL