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自定义函数的创建、调用和函数的参数详解
Mar 11 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
Dec 04 Python
浅谈Python中带_的变量或函数命名
Dec 04 Python
Python中一行和多行import模块问题
Apr 01 Python
Python 统计字数的思路详解
May 08 Python
python2.7的flask框架之引用js&css等静态文件的实现方法
Aug 22 Python
使用Django搭建一个基金模拟交易系统教程
Nov 18 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
Nov 19 Python
Python网络爬虫四大选择器用法原理总结
Jun 01 Python
python 6行代码制作月历生成器
Sep 18 Python
PIP和conda 更换国内安装源的方法步骤
Sep 21 Python
Python List remove()实例用法详解
Aug 02 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
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
JavaScipt基本教程之JavaScript语言的基础
2008/01/16 Javascript
点击文章内容处弹出页面代码
2009/10/01 Javascript
JavaScript toFixed() 方法
2010/04/15 Javascript
js 静态动态成员 and 信息的封装和隐藏
2011/05/29 Javascript
jquery中animate动画积累的解决方法
2013/10/05 Javascript
探讨js中的双感叹号判断
2013/11/11 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
Js数组排序函数sort()介绍
2015/06/08 Javascript
swtich/if...else的替代语句
2015/08/16 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
2016/12/13 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
2020/12/30 Javascript
JS实现的杨辉三角【帕斯卡三角形】算法示例
2019/02/26 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
微信小程序picker组件两列关联使用方式
2020/10/27 Javascript
[00:32]2018DOTA2亚洲邀请赛VG出场
2018/04/03 DOTA
[01:02:05]LGD vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
零基础写python爬虫之抓取糗事百科代码分享
2014/11/06 Python
Python中动态检测编码chardet的使用教程
2017/07/06 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
瑞典的玛丽小姐:Miss Mary of Sweden
2019/02/13 全球购物
加拿大在线旅游公司:Flighthub
2019/03/11 全球购物
心碎乌托邦的创业计划书范文
2013/12/26 职场文书
市场营销战略计划书
2014/05/06 职场文书
汉语专业毕业生自荐信
2014/07/06 职场文书
新店开张宣传语
2015/07/13 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
Nginx内网单机反向代理的实现
2021/11/07 Servers
java协程框架quasar和kotlin中的协程对比分析
2022/02/24 Java/Android