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 相关文章推荐
pip 错误unused-command-line-argument-hard-error-in-future解决办法
Jun 01 Python
Python解析excel文件存入sqlite数据库的方法
Nov 15 Python
Python 稀疏矩阵-sparse 存储和转换
May 27 Python
python中判断文件编码的chardet(实例讲解)
Dec 21 Python
Python基于FTP模块实现ftp文件上传操作示例
Apr 23 Python
python打印n位数“水仙花数”(实例代码)
Dec 25 Python
python 实现按对象传值
Dec 26 Python
Python面向对象之私有属性和私有方法应用案例分析
Dec 31 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
Jan 24 Python
Python字典深浅拷贝与循环方式方法详解
Feb 09 Python
教你怎么用Python selenium操作浏览器对象的基础API
Jun 23 Python
Python 统计序列中元素的出现频度
Apr 26 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 根据key 给二维数组分组
2016/12/09 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
PHP7扩展开发之hello word实现方法详解
2018/01/15 PHP
PHP实现的CURL非阻塞调用类
2018/07/26 PHP
PHP htmlentities()函数用法讲解
2019/02/25 PHP
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
JQuery中serialize()用法实例分析
2015/02/06 Javascript
全屏js头像上传插件源码高清版
2016/03/29 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
2016/10/05 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
浅谈react-router HashRouter和BrowserRouter的使用
2017/12/29 Javascript
vue打包的时候自动将px转成rem的操作方法
2018/06/20 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
在微信小程序中使用mqtt服务的方法
2019/12/13 Javascript
JS如何把字符串转换成json
2020/02/21 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
2020/05/16 Javascript
Vue Render函数创建DOM节点代码实例
2020/07/08 Javascript
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python UDP(udp)协议发送和接收的实例
2019/07/22 Python
使用TensorFlow-Slim进行图像分类的实现
2019/12/31 Python
python next()和iter()函数原理解析
2020/02/07 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
Python3如何在服务器打印资产信息
2020/08/27 Python
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
丝芙兰墨西哥官网:Sephora墨西哥
2020/05/30 全球购物
网络技术支持面试题
2013/04/22 面试题
如何填写个人简历自我评价
2013/12/10 职场文书
船舶工程技术专业求职信
2014/08/07 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
Python opencv缺陷检测的实现及问题解决
2021/04/24 Python