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 26 Python
EM算法的python实现的方法步骤
Jan 02 Python
python3.x上post发送json数据
Mar 04 Python
解决已经安装requests,却依然提示No module named requests问题
May 18 Python
tensorflow实现逻辑回归模型
Sep 08 Python
Python开启线程,在函数中开线程的实例
Feb 22 Python
python基于递归解决背包问题详解
Jul 03 Python
python给图像加上mask,并提取mask区域实例
Jan 19 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
Jul 03 Python
python实现b站直播自动发送弹幕功能
Feb 20 Python
Python实现8种常用抽样方法
Jun 27 Python
浅析Python OpenCV三种滤镜效果
Apr 11 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
php2html php生成静态页函数
2008/12/08 PHP
PHP多维数组遍历方法(2种实现方法)
2015/12/10 PHP
PHP简单实现合并2个数字键数组值的方法
2017/05/30 PHP
总结一些PHP中好用但又容易忽略的小知识
2017/06/02 PHP
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
jQuery操作input type=radio的实现代码
2012/06/14 Javascript
解决js图片加载时出现404的问题
2020/11/30 Javascript
js实现弹窗暗层效果
2017/01/16 Javascript
JavaScript自定义分页样式
2017/01/17 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
2017/02/15 Javascript
node.js实现登录注册页面
2017/04/08 Javascript
nodejs 使用 js 模块的方法实例详解
2018/12/04 NodeJs
JS闭包经典实例详解
2018/12/20 Javascript
vue.js实现图书管理功能
2019/09/24 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
[29:10]Ti4 冒泡赛第二天 NEWBEE vs Titan 3
2014/07/15 DOTA
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python中实现两个字典(dict)合并的方法
2014/09/23 Python
Python中的高级数据结构详解
2015/03/27 Python
Python实现将Excel转换为json的方法示例
2017/08/05 Python
儿童python练习实例
2018/05/27 Python
python+pygame实现坦克大战
2019/09/10 Python
Python爬虫爬取Bilibili弹幕过程解析
2019/10/10 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
2020/03/09 Python
Django静态资源部署404问题解决方案
2020/05/11 Python
Anaconda+vscode+pytorch环境搭建过程详解
2020/05/25 Python
Python参数传递及收集机制原理解析
2020/06/05 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
斯巴达比赛商店:Spartan Race
2019/01/08 全球购物
英国时尚泳装品牌:Maru Swimwear
2019/10/06 全球购物
庆祝教师节活动方案
2014/01/31 职场文书
学生干部培训方案
2014/06/12 职场文书
证婚人致辞精选
2015/07/28 职场文书
2015年小学远程教育工作总结
2015/07/28 职场文书
幼儿园教师管理制度
2015/08/05 职场文书
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android