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中的hypot()方法使用简介
May 18 Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 Python
分享Pycharm中一些不为人知的技巧
Apr 03 Python
python读取视频流提取视频帧的两种方法
Oct 22 Python
flask入门之文件上传与邮件发送示例
Jul 18 Python
浅析python中numpy包中的argsort函数的使用
Aug 30 Python
Linux下python3.6.1环境配置教程
Sep 26 Python
python 用户交互输入input的4种用法详解
Sep 24 Python
python 字典访问的三种方法小结
Dec 05 Python
TensorFlow 读取CSV数据的实例
Feb 05 Python
Python+OpenCV图像处理——实现直线检测
Oct 23 Python
Python爬虫基础初探selenium
May 31 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 无限级 SelectTree 类
2009/05/19 PHP
通过PHP CLI实现简单的数据库实时监控调度
2009/07/01 PHP
Chrome Web App开发小结
2014/09/04 PHP
php下Memcached入门实例解析
2015/01/05 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
javascript中的new使用
2010/03/20 Javascript
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
js 判断checkbox是否选中的操作方法
2012/11/09 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
Extjs 4.x 得到form CheckBox 复选框的值
2014/05/04 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
JavaScript数组常用操作技巧汇总
2014/11/17 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
2015/09/04 Javascript
原生JS下拉加载插件分享
2016/12/26 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
Base64(二进制)图片编码解析及在各种浏览器的兼容性处理
2017/02/09 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
解决VUE中document.body.scrollTop为0的问题
2018/09/15 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
2018/12/03 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
[05:01]3.19DOTA2发布会 我们都是刀塔人
2014/03/25 DOTA
Python语言实现将图片转化为html页面
2017/12/06 Python
python实现感知器
2017/12/19 Python
Django自定义用户认证示例详解
2018/03/14 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
通过celery异步处理一个查询任务的完整代码
2019/11/19 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
城野医生官方海外旗舰店:风靡亚洲毛孔收敛水
2018/04/26 全球购物
仓管员岗位责任制
2014/02/19 职场文书
MySQL Router的安装部署
2021/04/24 MySQL
关于pytest结合csv模块实现csv格式的数据驱动问题
2022/05/30 Python