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 除法小技巧
Sep 06 Python
Python3实现生成随机密码的方法
Aug 23 Python
python3.4实现邮件发送功能
May 28 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
Apr 15 Python
Numpy之reshape()使用详解
Dec 26 Python
基于python+selenium的二次封装的实现
Jan 06 Python
Python如何实现小程序 无限求和平均
Feb 18 Python
Python类的绑定方法和非绑定方法实例解析
Mar 04 Python
keras分类之二分类实例(Cat and dog)
Jul 09 Python
python中pivot()函数基础知识点
Jan 03 Python
在python3.9下如何安装scrapy的方法
Feb 03 Python
Python实战之疫苗研发情况可视化
May 18 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语法(2)
2006/10/09 PHP
php面向对象 字段的声明与使用
2012/06/14 PHP
PHP7数组的底层实现示例
2019/08/25 PHP
JQuery实现倒计时按钮的实现代码
2012/03/23 Javascript
js、css、img等浏览器缓存问题的2种解决方案
2013/10/23 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
2013/12/10 Javascript
js中将String转换为number以便比较
2014/07/08 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
跟我学习javascript创建对象(类)的8种方法
2015/11/20 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
JavaScript 不支持 indexof 该如何解决
2016/03/30 Javascript
CSS+jQuery实现简单的折叠菜单
2016/12/20 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
去掉vue 中的代码规范检测两种方法(Eslint验证)
2018/03/21 Javascript
基于vue-video-player自定义播放器的方法
2018/03/21 Javascript
JS限制输入框输入的实现代码
2018/07/02 Javascript
vue-router跳转时打开新页面的两种方法
2019/07/29 Javascript
解决vue.js提交数组时出现数组下标的问题
2019/11/05 Javascript
Python中操作文件之write()方法的使用教程
2015/05/25 Python
Python装饰器实现几类验证功能做法实例
2017/05/18 Python
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
Python异常处理操作实例详解
2018/08/28 Python
对Python3 pyc 文件的使用详解
2019/02/16 Python
Python datetime和unix时间戳之间相互转换的讲解
2019/04/01 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
Python for循环及基础用法详解
2019/11/08 Python
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
学生学习总结的自我评价
2013/10/22 职场文书
计算机专业个人简短的自我评价
2013/10/23 职场文书
《鱼游到了纸上》教学反思
2014/02/20 职场文书
房产代理公证处委托书
2014/04/04 职场文书
2014年物业公司工作总结
2014/11/22 职场文书
主持人大赛开场白
2015/05/29 职场文书
庆祝教师节主题班会
2015/08/17 职场文书
Python实现机器学习算法的分类
2021/06/03 Python