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 字典dict使用介绍
Nov 30 Python
在Python的Django框架中编写编译函数
Jul 20 Python
Python科学计算之NumPy入门教程
Jan 15 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
Jan 09 Python
Python爬虫包BeautifulSoup实例(三)
Jun 17 Python
python查看模块,对象的函数方法
Oct 16 Python
浅谈pycharm的xmx和xms设置方法
Dec 03 Python
Python文件读写常见用法总结
Feb 22 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
Jul 22 Python
django使用graphql的实例
Sep 02 Python
用Python可视化新冠疫情数据
Jan 18 Python
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
Mar 03 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
多重?l件?合查?(一)
2006/10/09 PHP
php 常用类整理
2009/12/23 PHP
分享一个漂亮的php验证码类
2016/09/29 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
js 颜色选择器(兼容firefox)
2009/03/05 Javascript
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
js中的caller和callee属性介绍和例子
2014/06/07 Javascript
原生js实现复制对象、扩展对象 类似jquery中的extend()方法
2014/08/30 Javascript
详解javascript函数的参数
2015/11/10 Javascript
基于jquery实现省市区三级联动效果
2015/12/25 Javascript
值得分享的bootstrap table实例
2016/09/22 Javascript
分享一个原生的JavaScript拖动方法
2016/09/25 Javascript
javascript过滤数组重复元素的实现方法
2017/05/03 Javascript
JS 验证密码 不能为空,必须含有数字、字母、特殊字符,长度在8-12位
2017/06/21 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
javascript Function函数理解与实战
2017/12/01 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
2018/01/30 Javascript
vue和webpack打包项目相对路径修改的方法
2018/06/15 Javascript
vue移动端监听滚动条高度的实现方法
2018/09/03 Javascript
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
jupyter安装小结
2016/03/13 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
2018/12/19 Python
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
澳大利亚宠物食品和用品商店:PETstock
2020/01/02 全球购物
CAT鞋加拿大官网:CAT Footwear加拿大
2020/08/05 全球购物
static函数与普通函数有什么区别
2015/12/25 面试题
解放思想大讨论活动心得体会
2014/09/11 职场文书
闪闪红星观后感
2015/06/08 职场文书
小学数学国培研修日志
2015/11/13 职场文书
简历中的自我评价怎么写呢?
2019/04/30 职场文书
详解Django中 render() 函数的使用方法
2021/04/22 Python