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使用7z解压软件备份文件脚本分享
Feb 21 Python
在Python中实现贪婪排名算法的教程
Apr 17 Python
用于统计项目中代码总行数的Python脚本分享
Apr 21 Python
python实现的简单文本类游戏实例
Apr 28 Python
Python中使用haystack实现django全文检索搜索引擎功能
Aug 26 Python
使用python将图片格式转换为ico格式的示例
Oct 22 Python
在python中使用requests 模拟浏览器发送请求数据的方法
Dec 26 Python
python图像处理入门(一)
Apr 04 Python
python实现串口通信的示例代码
Feb 10 Python
Django choices下拉列表绑定实例
Mar 13 Python
python安装读取grib库总结(推荐)
Jun 24 Python
python 从list中随机取值的方法
Nov 16 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中的日期处理方法集锦
2007/01/02 PHP
php 全局变量范围分析
2009/08/07 PHP
PHP实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
PHP-CGI远程代码执行漏洞分析与防范
2017/05/07 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
浅谈JavaScript实现面向对象中的类
2014/12/09 Javascript
jQuery模拟新浪微博首页滚动效果的方法
2015/03/11 Javascript
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
JavaScript实现无刷新上传预览图片功能
2017/08/02 Javascript
Bootstrap一款超好用的前端框架
2017/09/25 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
vue slot 在子组件中显示父组件传递的模板
2018/03/02 Javascript
10分钟彻底搞懂Http的强制缓存和协商缓存(小结)
2018/08/30 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
2018/11/28 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
2020/07/09 Javascript
JavaScript实现网页动态生成表格
2020/11/25 Javascript
用vue设计一个日历表
2020/12/03 Vue.js
利用python发送和接收邮件
2016/09/27 Python
分享一个简单的python读写文件脚本
2017/11/25 Python
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
Python Django框架防御CSRF攻击的方法分析
2019/10/18 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
2020/02/11 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
python的reverse函数翻转结果为None的问题
2020/05/11 Python
python+selenium爬取微博热搜存入Mysql的实现方法
2021/01/27 Python
叶问观后感
2015/06/15 职场文书
python之基数排序的实现
2021/07/26 Python