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写xml文件的操作实例
Oct 05 Python
在Python中使用pngquant压缩png图片的教程
Apr 09 Python
Python新手入门最容易犯的错误总结
Apr 24 Python
详解python3中socket套接字的编码问题解决
Jul 01 Python
python抖音表白程序源代码
Apr 07 Python
python将字符串转换成json的方法小结
Jul 09 Python
python flask搭建web应用教程
Nov 19 Python
Django单元测试中Fixtures的使用方法
Feb 26 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
Python持续监听文件变化代码实例
Jul 22 Python
python之语音识别speech模块
Sep 09 Python
Python趣味挑战之用pygame实现简单的金币旋转效果
May 31 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
PHP+DBM的同学录程序(1)
2006/10/09 PHP
PHP字符串比较函数strcmp()和strcasecmp()使用总结
2014/11/19 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
php两点地理坐标距离的计算方法
2018/12/29 PHP
jquery keypress,keyup,onpropertychange键盘事件
2010/06/25 Javascript
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
jQuery中的.bind()、.live()和.delegate()之间区别分析
2011/06/08 Javascript
JavaScript实现99乘法表及隔行变色实例代码
2016/02/24 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
2016/10/25 Javascript
vue.js利用defineProperty实现数据的双向绑定
2017/04/28 Javascript
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
基于游标的分页接口实现代码示例
2018/11/12 Javascript
深入理解react 组件类型及使用场景
2019/03/07 Javascript
js get和post请求实现代码解析
2020/02/06 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
Node使用koa2实现一个简单JWT鉴权的方法
2021/01/26 Javascript
python3图片转换二进制存入mysql
2013/12/06 Python
python批量修改文件后缀示例代码分享
2013/12/24 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
python实现输入的数据在地图上生成热力图效果
2019/12/06 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
2021/02/02 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
最好的意大利皮夹克:D’Arienzo
2018/12/04 全球购物
高级销售员求职信
2013/10/25 职场文书
工程管理专业毕业生自荐信
2014/01/24 职场文书
祖国在我心中的演讲稿
2014/05/04 职场文书
爬山的活动方案
2014/08/16 职场文书
优秀班主任申报材料
2014/12/16 职场文书
2015年服务员工作总结
2015/04/08 职场文书
幼儿园教师教学反思
2016/03/02 职场文书
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
2021/05/25 Vue.js
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python
Win11无法访问设备和打印机 如何解决页面空白
2022/04/09 数码科技
详解Android中的TimePickerView(时间选择器)的用法
2022/04/30 Java/Android