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()与urlretrieve()详解
Nov 01 Python
Python中使用动态变量名的方法
May 06 Python
Python 的 Socket 编程
Mar 24 Python
python黑魔法之参数传递
Feb 12 Python
在Pandas中给多层索引降级的方法
Nov 16 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
Apr 18 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
Aug 14 Python
Python 如何优雅的将数字转化为时间格式的方法
Sep 26 Python
Django接收照片储存文件的实例代码
Mar 07 Python
python可迭代对象去重实例
May 15 Python
python 开心网和豆瓣日记爬取的小爬虫
May 29 Python
Python趣味实战之手把手教你实现举牌小人生成器
Jun 07 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 图像尺寸调整代码
2010/05/26 PHP
jQuery+php实现ajax文件即时上传的详解
2013/06/17 PHP
浅析SVN常见问题及解决方法
2013/06/21 PHP
PHP文件缓存smarty模板应用实例分析
2016/02/26 PHP
yii2使用gridView实现下拉列表筛选数据
2017/04/10 PHP
DOM相关内容速查手册
2007/02/07 Javascript
jquery获取tr并更改tr内容示例代码
2014/02/13 Javascript
轻松创建nodejs服务器(9):实现非阻塞操作
2014/12/18 NodeJs
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
由ReactJS的Hello world说开来
2015/07/02 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
2017/01/20 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
Vue中keep-alive组件作用详解
2020/02/04 Javascript
linux 下以二进制的方式安装 nodejs
2020/02/12 NodeJs
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
[02:54]DOTA2亚洲邀请赛 VG战队出场宣传片
2015/02/07 DOTA
python类定义的讲解
2013/11/01 Python
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
Python中几个比较常见的名词解释
2015/07/04 Python
TensorFlow模型保存和提取的方法
2018/03/08 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
Python环境管理virtualenv&virtualenvwrapper的配置详解
2020/07/01 Python
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
校长岗位职责
2013/11/26 职场文书
工作失误检讨书范文大全
2014/01/13 职场文书
自我介绍演讲稿范文
2014/08/21 职场文书
党支部综合考察意见
2015/06/01 职场文书
个人收入证明格式
2015/06/24 职场文书
创业计划书之酒店
2019/08/30 职场文书
Nginx快速入门教程
2021/03/31 Servers
Javascript之datagrid查询详解
2021/09/15 Javascript