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编程中JSON模块的使用
Oct 15 Python
Python tkinter label 更新方法
Oct 11 Python
对python3标准库httpclient的使用详解
Dec 18 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 Python
如何解决django-celery启动后迅速关闭
Oct 16 Python
PYTHON实现SIGN签名的过程解析
Oct 28 Python
Python for循环及基础用法详解
Nov 08 Python
Python随机数函数代码实例解析
Feb 09 Python
解决python Jupyter不能导入外部包问题
Apr 15 Python
利用python实现平稳时间序列的建模方式
Jun 03 Python
接口自动化多层嵌套json数据处理代码实例
Nov 20 Python
Python绘制散点图之可视化神器pyecharts
Jul 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 google或baidu分页代码
2009/11/26 PHP
解析php中curl_multi的应用
2013/07/17 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
PHP 魔术变量和魔术函数详解
2015/02/25 PHP
PHP处理postfix邮件内容的方法
2015/06/16 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
2015/12/31 PHP
5 cool javascript apps
2007/03/24 Javascript
ie focus bug 解决方法
2009/09/03 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
AngularJS基础 ng-class-odd 指令示例
2016/08/01 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
JavaScript+HTML5实现的日期比较功能示例
2017/07/12 Javascript
推荐10款扩展Web表单的JS插件
2017/12/25 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
[01:38]完美世界高校联赛决赛花絮
2018/12/02 DOTA
python备份文件以及mysql数据库的脚本代码
2013/06/10 Python
Python用Pillow(PIL)进行简单的图像操作方法
2017/07/07 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
python使用requests模块实现爬取电影天堂最新电影信息
2019/04/03 Python
利用python实现凯撒密码加解密功能
2020/03/31 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
Python QT组件库qtwidgets的使用
2020/11/02 Python
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
Marc Jacobs官方网站:美国奢侈品牌
2017/08/29 全球购物
教师师德承诺书
2014/03/26 职场文书
素质教育标语
2014/06/27 职场文书
2015年电工工作总结
2015/04/10 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
学术会议领导致辞
2015/07/29 职场文书
导游词之无锡梅园
2019/11/28 职场文书
Win11快速关闭所有广告推荐
2022/04/19 数码科技