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中的hashlib和base64加密模块使用实例
Sep 02 Python
理解Python中的With语句
Feb 02 Python
在Python的web框架中编写创建日志的程序的教程
Apr 30 Python
Python中计算三角函数之cos()方法的使用简介
May 15 Python
python&MongoDB爬取图书馆借阅记录
Feb 05 Python
Python中规范定义命名空间的一些建议
Jun 04 Python
完美解决Python2操作中文名文件乱码的问题
Jan 04 Python
python 删除非空文件夹的实例
Apr 26 Python
Python django使用多进程连接mysql错误的解决方法
Oct 08 Python
python hash每次调用结果不同的原因
Nov 21 Python
Python 写了个新型冠状病毒疫情传播模拟程序
Feb 14 Python
Python类绑定方法及非绑定方法实例解析
Oct 09 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制作unicode解码工具(unicode编码转换器)代码分享
2013/12/24 PHP
PHP中使用smarty生成静态文件的例子
2014/04/24 PHP
ThinkPHP中的三大自动简介
2014/08/22 PHP
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
利用JS来控制键盘的上下左右键(示例代码)
2013/12/14 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
2014/03/28 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
jQuery中removeData()方法用法实例
2014/12/27 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
2015/08/15 Javascript
js表单提交和submit提交的区别实例分析
2015/12/10 Javascript
浅析在javascript中创建对象的各种模式
2016/05/06 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
基于jQuery实现的查看全文功能【实用】
2016/12/11 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
Vue动态加载异步组件的方法
2018/11/21 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
2019/04/17 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
Vue.js中provide/inject实现响应式数据更新的方法示例
2019/10/16 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
2020/02/14 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
python中类的属性和方法介绍
2018/11/27 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
python如何提升爬虫效率
2020/09/27 Python
专业实习自我鉴定
2013/10/29 职场文书
战友聚会邀请函
2014/01/18 职场文书
畜牧兽医本科生的自我评价
2014/03/03 职场文书
晨会主持词
2014/03/17 职场文书
个人批评与自我批评总结
2014/10/17 职场文书
2014年卫生工作总结
2014/11/27 职场文书
2014年街道办事处工作总结
2014/12/11 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
2019年幼儿园家长接送责任书
2019/10/29 职场文书
cypress测试本地web应用
2022/06/01 Javascript