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库urllib与urllib2主要区别分析
Jul 13 Python
在Docker上部署Python的Flask框架的教程
Apr 08 Python
在Python的框架中为MySQL实现restful接口的教程
Apr 08 Python
Python的Bottle框架中返回静态文件和JSON对象的方法
Apr 30 Python
python实现的希尔排序算法实例
Jul 01 Python
Python编程对列表中字典元素进行排序的方法详解
May 26 Python
Pandas中resample方法详解
Jul 02 Python
python flask web服务实现更换默认端口和IP的方法
Jul 26 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
Oct 25 Python
有关pycharm登录github时有的时候会报错connection reset的问题
Sep 15 Python
python文件路径操作方法总结
Dec 21 Python
手把手教你实现PyTorch的MNIST数据集
Jun 28 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图片处理类 phpThumb参数用法介绍
2012/03/11 PHP
PHP中提问频率最高的11个面试题和答案
2014/09/02 PHP
ThinkPHP 模板引擎使用详解
2017/05/07 PHP
PHP异常类及异常处理操作实例详解
2018/12/19 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
nodejs教程之异步I/O
2014/11/21 NodeJs
基于javascript实现的搜索时自动提示功能
2014/12/26 Javascript
借助FileReader实现将文件编码为Base64后通过AJAX上传
2015/12/24 Javascript
JavaScript类型系统之基本数据类型与包装类型
2016/01/06 Javascript
ECMAScript6--解构
2017/03/30 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
ligerUI---ListBox(列表框可移动的实例)
2017/11/28 Javascript
Vue.js图片预览插件使用详解
2018/08/27 Javascript
javascriptvoid(0)含义以及与"#"的区别讲解
2019/01/19 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
vue移动端的左右滑动事件详解
2020/06/17 Javascript
[37:45]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第二场 12.09
2020/12/11 DOTA
python使用range函数计算一组数和的方法
2015/05/07 Python
python编写爬虫小程序
2015/05/14 Python
Python编程中用close()方法关闭文件的教程
2015/05/24 Python
对Python 文件夹遍历和文件查找的实例讲解
2018/04/26 Python
python矩阵转换为一维数组的实例
2018/06/05 Python
Python中__slots__属性介绍与基本使用方法
2018/09/05 Python
Flask框架web开发之零基础入门
2018/12/10 Python
Python3.5常见内置方法参数用法实例详解
2019/04/29 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
python线程的几种创建方式详解
2019/08/29 Python
Python  word实现读取及导出代码解析
2020/07/09 Python
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
PHP面试题附答案
2015/11/28 面试题
实习护理工作自我评价
2013/09/25 职场文书
婚庆司仪主持词
2014/03/15 职场文书
建筑安全责任书范本
2014/07/24 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书
聘任书的格式及模板
2019/10/28 职场文书