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中变量交换的例子
Aug 25 Python
解决python os.mkdir创建目录失败的问题
Oct 16 Python
神经网络相关之基础概念的讲解
Dec 29 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
Jan 30 Python
Python3.6.x中内置函数总结及讲解
Feb 22 Python
python 实现Flask中返回图片流给前端展示
Jan 09 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
Feb 11 Python
Python基础类继承重写实现原理解析
Apr 03 Python
python的链表基础知识点
Sep 13 Python
Django中使用Celery的方法步骤
Dec 07 Python
Pycharm 解决自动格式化冲突的设置操作
Jan 15 Python
python析构函数用法及注意事项
Jun 22 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+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
fleaphp crud操作之find函数的使用方法
2011/04/23 PHP
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
2012/08/08 PHP
PHP 常用的header头部定义汇总
2015/06/19 PHP
使用PHPCMS搭建wap手机网站
2015/09/20 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
23个超流行的jQuery相册插件整理分享
2011/04/25 Javascript
解析offsetHeight,clientHeight,scrollHeight之间的区别
2013/11/20 Javascript
js/jquery获取文本框输入焦点的方法
2014/03/04 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
javascript 应用小技巧方法汇总
2015/07/05 Javascript
10个很棒的jQuery代码片段
2015/09/24 Javascript
简单实现JS对dom操作封装
2015/12/02 Javascript
深入浅析Extjs中store分组功能的使用方法
2016/04/20 Javascript
JavaScript数组复制详解
2017/02/02 Javascript
老生常谈javascript的面向对象思想
2017/08/22 Javascript
Element input树型下拉框的实现代码
2018/12/21 Javascript
Python3基础之输入和输出实例分析
2014/08/18 Python
python登录豆瓣并发帖的方法
2015/07/08 Python
python实现守护进程、守护线程、守护非守护并行
2018/05/05 Python
在python Numpy中求向量和矩阵的范数实例
2019/08/26 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
2020/05/19 Python
python实现数字炸弹游戏程序
2020/07/17 Python
python 装饰器的基本使用
2021/01/13 Python
html5 Canvas绘制线条 closePath()实例代码
2012/05/10 HTML / CSS
Lookfantastic日本官网:英国知名护肤、化妆品和头发护理购物网站
2018/04/21 全球购物
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
Ruby如何进行文件操作
2014/07/17 面试题
信息与计算科学专业推荐信
2014/02/23 职场文书
环保公益广告语
2014/03/13 职场文书
新郎结婚保证书
2015/02/26 职场文书
投诉信格式范文
2015/07/02 职场文书
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
2021/04/05 Python
分布式架构Redis中有哪些数据结构及底层实现原理
2022/03/13 Redis