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使用urllib模块的urlopen超时问题解决方法
Nov 08 Python
Django数据库表反向生成实例解析
Feb 06 Python
Python函数返回不定数量的值方法
Jan 22 Python
解决django服务器重启端口被占用的问题
Jul 26 Python
python中for循环变量作用域及用法详解
Nov 05 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
Feb 05 Python
Python模块zipfile原理及使用方法详解
Aug 04 Python
Python3实现英文字母转换哥特式字体实例代码
Sep 01 Python
如何快速一次性卸载所有python包(第三方库)呢
Oct 20 Python
python切片作为占位符使用实例讲解
Feb 17 Python
python opencv检测直线 cv2.HoughLinesP的实现
Jun 18 Python
Python Pygame实战之塔防游戏的实现
Mar 17 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实现商品成交时发送短信功能
2016/05/11 PHP
PHP实现的数独求解问题示例
2017/04/18 PHP
laravel migrate初学常见错误的解决方法
2017/10/11 PHP
PHP迭代器和迭代的实现与使用方法分析
2018/04/19 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2019/10/15 PHP
许愿墙中用到的函数
2006/10/07 Javascript
Javascript 篱式条件判断
2008/08/22 Javascript
Javascript 实用小技巧
2010/04/07 Javascript
ExtJs Excel导出并下载IIS服务器端遇到的问题
2011/09/16 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
2016/11/25 Javascript
对比分析Django的Q查询及AngularJS的Datatables分页插件
2017/02/07 Javascript
JS如何设置元素样式的方法示例
2017/08/28 Javascript
使用Vue.js和Element-UI做一个简单登录页面的实例
2018/02/23 Javascript
ES7之Async/await的使用详解
2019/03/28 Javascript
JS实现页面数据懒加载
2020/02/13 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
在antd中setFieldsValue和defaultVal的用法
2020/10/29 Javascript
[02:09]EHOME夺得首届辉夜杯冠军—现场颁奖仪式
2015/12/28 DOTA
Python脚本实现DNSPod DNS动态解析域名
2015/02/14 Python
python Django模板的使用方法
2016/01/14 Python
pygame加载中文名mp3文件出现error
2017/03/31 Python
python实现超市扫码仪计费
2018/05/30 Python
Python高斯消除矩阵
2019/01/02 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
Python3.9又更新了:dict内置新功能
2020/02/28 Python
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
护士辞职信范文
2014/01/19 职场文书
《小石潭记》教学反思
2014/02/13 职场文书
个人承诺书格式
2014/06/03 职场文书
监守自盗观后感
2015/06/10 职场文书
MySQL基础(一)
2021/04/05 MySQL