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在不同层级目录import模块的方法
Jan 31 Python
Python字典简介以及用法详解
Nov 15 Python
Python学习小技巧之列表项的推导式与过滤操作
May 20 Python
Python操作csv文件实例详解
Jul 31 Python
python遍历文件夹找出文件夹后缀为py的文件方法
Oct 21 Python
python 输入一个数n,求n个数求乘或求和的实例
Nov 13 Python
python实现按行分割文件
Jul 22 Python
python破解bilibili滑动验证码登录功能
Sep 11 Python
python实现两个一维列表合并成一个二维列表
Dec 02 Python
python 引用传递和值传递详解(实参,形参)
Jun 05 Python
一文详述 Python 中的 property 语法
Sep 01 Python
Python如何识别银行卡卡号?
Jun 10 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二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
一致性哈希算法以及其PHP实现详细解析
2013/08/24 PHP
php获取本机真实IP地址实例代码
2016/03/31 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
Mac系统下安装PHP Xdebug
2018/03/30 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
疯掉了,尽然有js写的操作系统
2007/04/23 Javascript
JS 在指定数组中随机取出N个不重复的数据
2014/06/10 Javascript
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
js实现带简单弹性运动的导航条
2017/02/22 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
2018/08/15 Javascript
使用ECharts实现状态区间图
2018/10/25 Javascript
vue拖拽组件使用方法详解
2018/12/01 Javascript
elementUI table表格动态合并的示例代码
2019/05/15 Javascript
vue中在vuex的actions中请求数据实例
2019/11/08 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
2020/08/04 Javascript
[03:58]2014DOTA2国际邀请赛 龙宝赛后解密DK获胜之道
2014/07/14 DOTA
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
教你安装python Django(图文)
2013/11/04 Python
python使用beautifulsoup从爱奇艺网抓取视频播放
2014/01/23 Python
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
python简单获取数组元素个数的方法
2015/07/13 Python
使用python opencv对目录下图片进行去重的方法
2019/01/12 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
2019/06/26 Python
html5清空画布方法(三种)
2017/10/16 HTML / CSS
Casadei卡萨蒂官网:意大利奢侈鞋履品牌
2017/10/28 全球购物
求职信名称怎么写
2014/05/26 职场文书
人事局接收函
2015/01/31 职场文书
客房领班岗位职责
2015/02/11 职场文书
肖申克救赎观后感
2015/06/02 职场文书
Python 居然可以在 Excel 中画画你知道吗
2022/02/15 Python
python计算列表元素与乘积详情
2022/08/05 Python