Python单例模式实例详解


Posted in Python onMarch 01, 2017

本文实例讲述了Python单例模式。分享给大家供大家参考,具体如下:

单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点。

实现某个类只有一个实例的途径:

1,让一个全局变量使得一个对象被访问,但是他不能防止外部实例化多个对象。

2,让类自身保存他的唯一实例,这个类可以保证没有其他实例可以被创建。

多线程时的单例模式:加锁-双重锁定

饿汉式单例类:在类被加载时就将自己实例化(静态初始化)。其优点是躲避了多线程访问的安全性问题,缺点是提前占用系统资源。

懒汉式单例类:在第一次被引用时,才将自己实例化。避免开始时占用系统资源,但是有多线程访问安全性问题。

实例:

#encoding=utf-8
#单例模式
def PrintInfo(info):
#  print unicode(info,'utf-8').decode('gbk')
  print info.decode('utf-8').encode('utf-8')
import threading
#单例类
class Singleton():
  instance=None
  mutex=threading.Lock()
  def _init__(self):
    pass
  @staticmethod
  def GetInstance():
    if(Singleton.instance==None):
      Singleton.mutex.acquire()
      if(Singleton.instance==None):
        PrintInfo('初始化实例')
        Singleton.instance=Singleton()
      else:
        PrintInfo('单例已经实例化')
      Singleton.mutex.release()
    else:
      PrintInfo('单例已经实例化')
    return Singleton.instance
def clientUI():
  Singleton.GetInstance()
  Singleton.GetInstance()
  Singleton.GetInstance()
  return
if __name__=='__main__':
  clientUI();

结果:

初始化实例 单例已经实例化 单例已经实例化

追加解释 @staticmethod 在 Python中提到 classmethod 就要提到 staticmethod,不是因为二者有什么关系,而是为了让用户区分以便更清楚地写代码。在C++中,我们了解直接通过类名访问的函数称为类的静态函数,即static修饰的函数,可见C++中classmethod和staticmethod是一个概念。 那么python中二者有什么区别呢?先来看下二者如何在python代码中声明

class MyClass:
 ...
 @classmethod # classmethod的修饰符
 def class_method(cls, arg1, arg2, ...):
  ...
 @staticmethod # staticmethod的修饰符
 def static_method(arg1, arg2, ...):
  ...

对于classmethod的参数,需要隐式地传递类名,而staticmethod参数中则不需要传递类名,其实这就是二者最大的区别。

二者都可以通过类名或者类实例对象来调用,因为强调的是classmethod和staticmethod,所以在写代码的时候最好使用类名,良好的编程习惯吧。

对于staticmethod就是为了要在类中定义而设置的,一般来说很少这样使用,可以使用模块级(module-level)的函数来替代它。既然要把它定义在类中,想必有作者的考虑。

对于classmethod,可以通过子类来进行重定义。

提到类级别的函数,也顺带提及类级别的变量

class MyClass:
 i = 123 # class-level variable
 def __init__(self):
 self.i = 456 # object-level variable
 ...

为了清晰地区分上面两个i,最好的办法就是考虑到python中的一切都是object,所以i=123属于class object的,i=456属于class instance object

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python实现的udp协议Server和Client代码实例
Jun 04 Python
Python2.x利用commands模块执行Linux shell命令
Mar 11 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
Nov 02 Python
python使用正则表达式替换匹配成功的组
Nov 17 Python
python微信公众号开发简单流程
Mar 23 Python
python Spyder界面无法打开的解决方法
Apr 27 Python
对python csv模块配置分隔符和引用符详解
Dec 12 Python
python实现两张图片的像素融合
Feb 23 Python
python读文件的步骤
Oct 08 Python
vscode写python时的代码错误提醒和自动格式化的方法
May 07 Python
关于tf.matmul() 和tf.multiply() 的区别说明
Jun 18 Python
Python中Numpy和Matplotlib的基本使用指南
Nov 02 Python
python实现字典(dict)和字符串(string)的相互转换方法
Mar 01 #Python
python 截取 取出一部分的字符串方法
Mar 01 #Python
详解Python中的静态方法与类成员方法
Feb 28 #Python
python基于itchat实现微信群消息同步机器人
Feb 27 #Python
不要用强制方法杀掉python线程
Feb 26 #Python
Python实现 多进程导入CSV数据到 MySQL
Feb 26 #Python
python检查URL是否正常访问的小技巧
Feb 25 #Python
You might like
PHP一些有意思的小区别
2006/12/06 PHP
php读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
php中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
2014/07/10 PHP
PHP中使用GD库创建圆形饼图的例子
2014/11/19 PHP
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
浅谈javascript中call()、apply()、bind()的用法
2015/04/20 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
搭建简单的nodejs http服务器详解
2017/03/09 NodeJs
jquery实现tab键进行选择后enter键触发click行为
2017/03/29 jQuery
nodejs模块学习之connect解析
2017/07/05 NodeJs
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
JS实现简单日历特效
2020/01/03 Javascript
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
如何使用七牛Python SDK写一个同步脚本及使用教程
2015/08/23 Python
Windows安装Python、pip、easy_install的方法
2017/03/05 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
2018/11/10 Python
python word转pdf代码实例
2019/08/16 Python
Python closure闭包解释及其注意点详解
2019/08/28 Python
Python 实现自动获取种子磁力链接方式
2020/01/16 Python
Python 爬虫的原理
2020/07/30 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
html5 div布局与table布局详解
2016/11/16 HTML / CSS
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
学生实习介绍信
2014/01/15 职场文书
爷爷追悼会答谢词
2014/01/24 职场文书
幼儿园教师国培感言
2014/02/02 职场文书
知识竞赛活动方案
2014/02/18 职场文书
小学教师寄语大全
2014/04/03 职场文书
2014党委书记四风问题对照检查材料思想汇报
2014/09/22 职场文书
JS数组的常用方法整理
2021/03/31 Javascript
进行数据处理的6个 Python 代码块分享
2022/04/06 Python