Python单例模式实例分析


Posted in Python onJanuary 14, 2015

本文实例讲述了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实现方便使用的级联进度信息实例
May 05 Python
python3如何将docx转换成pdf文件
Mar 23 Python
python for循环输入一个矩阵的实例
Nov 14 Python
Python获取时间范围内日期列表和周列表的函数
Aug 05 Python
详解python中的index函数用法
Aug 06 Python
浅谈keras的深度模型训练过程及结果记录方式
Jan 24 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
Feb 03 Python
Python使用Socket实现简单聊天程序
Feb 28 Python
Linux安装Python3如何和系统自带的Python2并存
Jul 23 Python
使用jupyter notebook运行python和R的步骤
Aug 13 Python
Python Sqlalchemy如何实现select for update
Oct 12 Python
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
Apr 27 Python
python文件读写操作与linux shell变量命令交互执行的方法
Jan 14 #Python
Python中使用Tkinter模块创建GUI程序实例
Jan 14 #Python
更改Python命令行交互提示符的方法
Jan 14 #Python
Python的迭代器和生成器使用实例
Jan 14 #Python
python实现带验证码网站的自动登陆实现代码
Jan 12 #Python
Python三元运算实现方法
Jan 12 #Python
Python中的True,False条件判断实例分析
Jan 12 #Python
You might like
discuz7 phpMysql操作类
2009/06/21 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
PHP面向对象详解(三)
2015/12/07 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
IE event.srcElement和FF event.target 功能比较
2010/03/01 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
2012/09/19 Javascript
自己编写的类似JS的trim方法
2013/10/09 Javascript
jquery中animate的stop()方法作用实例分析
2015/01/30 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
2016/05/25 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
微信小程序 特效菜单抽屉效果实例代码
2017/01/11 Javascript
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
node内置调试方法总结
2018/02/22 Javascript
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
vue实现文字加密功能
2019/09/27 Javascript
Vue-drag-resize 拖拽缩放插件的使用(简单示例)
2019/12/04 Javascript
vue前端和Django后端如何查询一定时间段内的数据
2021/02/28 Vue.js
浅析Python中else语句块的使用技巧
2016/06/16 Python
对numpy中shape的深入理解
2018/06/15 Python
深入了解Django中间件及其方法
2019/07/26 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
解决numpy矩阵相减出现的负值自动转正值的问题
2020/06/03 Python
用HTML5的canvas实现一个炫酷时钟效果
2016/05/20 HTML / CSS
达拉斯牛仔官方商店:Dallas Cowboys Pro Shop
2018/02/10 全球购物
雅高酒店中国:Accorhotels.com China
2018/03/26 全球购物
文员个人的求职信范文
2013/09/26 职场文书
班主任个人工作反思
2014/04/28 职场文书
大学生年度个人总结
2015/02/15 职场文书
巴黎圣母院观后感
2015/06/10 职场文书
论语读书笔记
2015/06/26 职场文书
消夏晚会主持词
2015/06/30 职场文书
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL
Mysql如何查看是否使用到索引
2022/12/24 MySQL