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的gevent框架下执行异步的Solr查询的教程
Apr 16 Python
Django中处理出错页面的方法
Jul 15 Python
分享一下如何编写高效且优雅的 Python 代码
Sep 07 Python
深入理解python中函数传递参数是值传递还是引用传递
Nov 07 Python
TensorFlow实现非线性支持向量机的实现方法
Apr 28 Python
python使用turtle库与random库绘制雪花
Jun 22 Python
Python 获取windows桌面路径的5种方法小结
Jul 15 Python
Python安装selenium包详细过程
Jul 23 Python
Apache部署Django项目图文详解
Jul 30 Python
Python 使用 environs 库定义环境变量的方法
Feb 25 Python
Python竟然能剪辑视频
May 25 Python
Python matplotlib多个子图绘制整合
Apr 13 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
文件上传的实现
2006/10/09 PHP
PHP+MySQL实现消息队列的方法分析
2018/05/09 PHP
javascript eval和JSON之间的联系
2009/12/31 Javascript
javascript 哈希表(hashtable)的简单实现
2010/01/20 Javascript
js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
2011/11/21 Javascript
js导出txt示例代码
2014/01/14 Javascript
使用typeof方法判断undefined类型
2014/09/09 Javascript
Javascript中的包装类型介绍
2015/04/02 Javascript
js实现三张图(文)片一起切换的banner焦点图
2015/08/25 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
php结合js实现多条件组合查询
2019/05/28 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
小程序Scroll-view上拉滚动刷新数据
2020/06/21 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
koa2 数据api中间件设计模型的实现方法
2020/07/13 Javascript
Python修改Excel数据的实例代码
2013/11/01 Python
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
python中的字典使用分享
2016/07/31 Python
如何在python中使用selenium的示例
2017/12/26 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
Ranorex通过Python将报告发送到邮箱的方法
2020/01/12 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
python如何更新包
2020/06/11 Python
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
利用Storage Event实现页面间通信的示例代码
2018/07/26 HTML / CSS
DC Shoes官网:美国滑板鞋和服饰品牌
2017/09/03 全球购物
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
世界上最受欢迎的钓鱼诱饵:Rapala
2019/05/02 全球购物
维多利亚的秘密阿联酋官网:Victoria’s Secret阿联酋
2019/12/07 全球购物
舞蹈专业求职信
2014/06/13 职场文书
幼儿园新生开学寄语
2015/05/27 职场文书