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 socket 超时设置 errno 10054
Jul 01 Python
举例讲解Python编程中对线程锁的使用
Jul 12 Python
Python模拟三级菜单效果
Sep 11 Python
python计算两个数的百分比方法
Jun 29 Python
django 将model转换为字典的方法示例
Oct 16 Python
python常用库之NumPy和sklearn入门
Jul 11 Python
python实现批量nii文件转换为png图像
Jul 18 Python
python批量将excel内容进行翻译写入功能
Oct 10 Python
Python 中判断列表是否为空的方法
Nov 24 Python
python上selenium的弹框操作实现
Jul 13 Python
利用python清除移动硬盘中的临时文件
Oct 28 Python
5分钟快速掌握Python定时任务框架的实现
Jan 26 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
基于MySQL体系结构的分析
2013/05/02 PHP
一个PHP的ZIP压缩类分享
2014/05/04 PHP
php建立Ftp连接的方法
2015/03/07 PHP
PHP读取Excel类文件
2017/05/15 PHP
jquery select选中的一个小问题
2009/10/11 Javascript
在JQuery dialog里的服务器控件 事件失效问题
2010/12/08 Javascript
javascript完美拖拽的实现方法
2013/09/29 Javascript
jQuery 实现自动填充邮箱功能(带下拉提示)
2014/10/14 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
jQuery动画效果相关方法实例分析
2015/12/31 Javascript
AngularJS实现Input格式化的方法
2016/11/07 Javascript
jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)
2016/12/22 Javascript
详解vue-Resource(与后端数据交互)
2017/01/16 Javascript
原生js轮播特效
2017/05/18 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
2019/04/15 Javascript
React优化子组件render的使用
2019/05/12 Javascript
layui表格设计以及数据初始化详解
2019/10/26 Javascript
微信小程序后端无法保持session的原因及解决办法问题
2020/03/20 Javascript
JS Generator 函数的含义与用法实例总结
2020/04/08 Javascript
npm ci命令的基本使用方法
2020/09/20 Javascript
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
Python使用matplotlib填充图形指定区域代码示例
2018/01/16 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
python实现倒计时小工具
2019/07/29 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
python numpy数组中的复制知识解析
2020/02/03 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
2020/09/25 Python
jupyter 添加不同内核的操作
2021/02/06 Python
实例讲解CSS3中的box-flex弹性盒属性布局
2016/06/09 HTML / CSS
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
2014/05/15 HTML / CSS
什么是Linux虚拟文件系统VFS
2012/01/31 面试题
领导的自我鉴定
2013/12/28 职场文书
医院护士的求职信
2014/01/03 职场文书
婚礼父母答谢词
2015/01/04 职场文书