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迭代器与生成器详解
Mar 10 Python
Python输出汉字字库及将文字转换为图片的方法
Jun 04 Python
Python标准库06之子进程 (subprocess包) 详解
Dec 07 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
对Python 除法负数取商的取整方式详解
Dec 12 Python
Python类装饰器实现方法详解
Dec 21 Python
在Python运行时动态查看进程内部信息的方法
Feb 22 Python
python字符串替换re.sub()方法解析
Sep 18 Python
python-视频分帧&多帧合成视频实例
Dec 10 Python
Django实现任意文件上传(最简单的方法)
Jun 03 Python
python怎么调用自己的函数
Jul 01 Python
Django nginx配置实现过程详解
Sep 10 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
关于js与php互相传值的介绍
2013/06/25 PHP
dedecms中使用php语句指南
2014/11/13 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
2017/09/01 PHP
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
jquery拖动插件(jquery.drag)使用介绍
2013/06/18 Javascript
优化Node.js Web应用运行速度的10个技巧
2014/09/03 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
浅谈EasyUI常用控件的禁用方法
2016/11/09 Javascript
bootstrap下拉菜单使用方法解析
2017/01/13 Javascript
JS设计模式之策略模式概念与用法分析
2018/02/05 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
vue-router二级导航切换路由及高亮显示的实现方法
2019/07/10 Javascript
vue在响应头response中获取自定义headers操作
2020/07/24 Javascript
python处理json数据中的中文
2014/03/06 Python
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
使用Python爬取最好大学网大学排名
2018/02/24 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
python中的split、rsplit、splitlines用法说明
2020/10/23 Python
图解CSS3制作圆环形进度条的实例教程
2016/05/26 HTML / CSS
美国高品质个性化珠宝销售网站:Jewlr
2018/05/03 全球购物
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
后勤人员自我鉴定
2013/10/20 职场文书
工厂保洁员岗位职责
2013/12/04 职场文书
美术国培研修感言
2014/02/12 职场文书
吨的认识教学反思
2014/04/27 职场文书
金融系应届毕业生求职信
2014/05/26 职场文书
2014财务年终工作总结
2014/12/08 职场文书
2014年安置帮教工作总结
2014/12/11 职场文书
六年级学生期末评语
2014/12/26 职场文书
培训师岗位职责
2015/02/14 职场文书
退休职工欢送会致辞
2015/08/01 职场文书
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript
详解Vue3使用axios的配置教程
2022/04/29 Vue.js