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中使用SAX解析xml实例
Nov 21 Python
Python使用filetype精确判断文件类型
Jul 02 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
Dec 20 Python
Python 使用PIL numpy 实现拼接图片的示例
May 08 Python
Python中如何使用if语句处理列表实例代码
Feb 24 Python
numpy数组之存取文件的实现示例
May 24 Python
python实现TCP文件传输
Mar 20 Python
django实现后台显示媒体文件
Apr 07 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
教你如何用python开发一款数字推盘小游戏
Apr 14 Python
python批量更改目录名/文件名的方法
Apr 18 Python
PyCharm 配置SSH和SFTP连接远程服务器
May 11 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
探讨如何把session存入数据库
2013/06/07 PHP
php自定义apk安装包实例
2014/10/20 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
封装好的省市地区联动控件附下载
2007/08/13 Javascript
网页运行时提示对象不支持abigimage属性或方法
2014/08/10 Javascript
jquery事件的ready()方法使用详解
2015/11/11 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
2016/06/28 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
2016/09/08 Javascript
es6系列教程_ Map详解以及常用api介绍
2017/09/25 Javascript
zTree节点文字过多的处理方法
2017/11/24 Javascript
Vue.directive使用注意(小结)
2018/08/31 Javascript
js实现搜索栏效果
2018/11/16 Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
2019/04/28 Javascript
微信小程序开发技巧汇总
2019/07/15 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
2020/10/29 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
深入浅出学习python装饰器
2017/09/29 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
2018/05/29 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
python安装requests库的实例代码
2019/06/25 Python
python3实现猜数字游戏
2020/12/07 Python
python实现图片压缩代码实例
2019/08/12 Python
django认证系统实现自定义权限管理的方法
2019/08/28 Python
jupyter notebook清除输出方式
2020/04/10 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
柏林通行证:Berlin Pass
2018/04/11 全球购物
人力资源主管的岗位职责
2014/03/15 职场文书
稽核岗位职责
2015/02/10 职场文书
欢迎新生标语2015
2015/07/16 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
MongoDB数据库的安装步骤
2021/06/18 MongoDB
Python如何将list中的string转换为int
2022/07/15 Ruby