Python中单例模式总结


Posted in Python onFebruary 20, 2018

一、单例模式

    a、单例模式分为四种:文件,类,基于__new__方法实现单例模式,基于metaclass方式实现

    b、类实现如下:

class Sigletion(objects):
  import time
  def __init__(self):
    time.sleep(1)
  @classmethod
  def instance(cls,*args,**kwargs)
    if not hasattr(Sigletion,'_instance'):
      Sigletion._instance=Sigletion(*args,**kwargs)
    return Sigletion._instance

import threading

daf task(arg):
  obj=Sigletion.instance()
  print(obj)

for i in range(10):
  t=threading.Thread(target=task,args=[i,])
  t.start()

    c、基于__new__方法实现单例模式

import time
import threading
class Singleton(object):
  _instance_lock=threading.Lock()
  def __init__(self):
    pass
  def __new__(cls, *args, **kwargs):
    if not hasattr(Singleton,"_instance"):
      with Singleton._instance_lock:
        if not hasattr(Singleton,"_instance"):
          Singleton._instance=object.__new__(cls,*args,**kwargs)
    return Singleton._instance

obj1=Singleton()
obj2=Singleton()
print(obj1,obj2)

def task(arg):
  obj = Singleton()
  print(obj)

for i in range(10):
  t = threading.Thread(target=task,args=[i,])
  t.start()

    d、基于metaclass方式实现单例模式

"""
1.对象是类创建,创建对象时候类的__init__方法自动执行,对象()执行类的 __call__ 方法
2.类是type创建,创建类时候type的__init__方法自动执行,类() 执行type的 __call__方法(类的__new__方法,类的__init__方法)

# 第0步: 执行type的 __init__ 方法【类是type的对象】
class Foo:
  def __init__(self):
    pass

  def __call__(self, *args, **kwargs):
    pass

# 第1步: 执行type的 __call__ 方法
#    1.1 调用 Foo类(是type的对象)的 __new__方法,用于创建对象。
#    1.2 调用 Foo类(是type的对象)的 __init__方法,用于对对象初始化。
obj = Foo()
# 第2步:执行Foodef __call__ 方法
obj()
"""

import threading

class SingletonType(type):
  _instace_lock=threading.Lock()
  def __call__(cls, *args, **kwargs):
    if not hasattr(cls, "_instance"):
      with SingletonType._instace_lock:
        if not hasattr(cls, "_instance"):
          cls._instance = super(SingletonType,cls).__call__(*args, **kwargs)
    return cls._instance
class Foo(metaclass=SingletonType):
  def __init__(self,name):
    self.name=name


obj1 = Foo('name')
obj2 = Foo('name')
print(obj1,obj2)
Python 相关文章推荐
从零学Python之入门(三)序列
May 25 Python
浅谈Python的垃圾回收机制
Dec 17 Python
Python中定时任务框架APScheduler的快速入门指南
Jul 06 Python
Django中使用celery完成异步任务的示例代码
Jan 23 Python
对Python 多线程统计所有csv文件的行数方法详解
Feb 12 Python
详解Python sys.argv使用方法
May 10 Python
python如何实现视频转代码视频
Jun 17 Python
Python配置文件处理的方法教程
Aug 29 Python
python取均匀不重复的随机数方式
Nov 27 Python
Python实现ATM系统
Feb 17 Python
Python基础之tkinter图形化界面学习
Apr 29 Python
yolov5返回坐标的方法实例
Mar 17 Python
ubuntu安装mysql pycharm sublime
Feb 20 #Python
python中(str,list,tuple)基础知识汇总
Feb 20 #Python
Python 反转字符串(reverse)的方法小结
Feb 20 #Python
python如何实现int函数的方法示例
Feb 19 #Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
Feb 18 #Python
Python cookbook(数据结构与算法)字典相关计算问题示例
Feb 18 #Python
Python cookbook(数据结构与算法)让字典保持有序的方法
Feb 18 #Python
You might like
过滤掉PHP数组中的重复值的实现代码
2011/07/17 PHP
PHP中的traits简单使用实例
2015/05/13 PHP
PHP+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
php+resumablejs实现的分块上传 断点续传功能示例
2017/04/18 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
2017/04/26 PHP
JavaScript 中的事件教程
2007/04/05 Javascript
javascript 读取图片文件的大小
2009/06/25 Javascript
javascript十个最常用的自定义函数(中文版)
2009/09/07 Javascript
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
jQuery 使用手册(四)
2009/09/23 Javascript
Js判断CSS文件加载完毕的具体实现
2014/01/17 Javascript
jQuery学习笔记之jQuery构建函数的7种方法
2014/06/03 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
JQuery中DOM实现事件移除的方法
2015/06/13 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
jquery封装插件时匿名函数形参和实参的写法解释
2017/02/14 Javascript
vue 粒子特效的示例代码
2017/09/19 Javascript
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
2018/01/05 NodeJs
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
2020/02/05 Javascript
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
python判断字符串是否包含子字符串的方法
2015/03/24 Python
windows上安装Anaconda和python的教程详解
2017/03/28 Python
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
python 构造三维全零数组的方法
2018/11/12 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
Flask和pyecharts实现动态数据可视化
2020/02/26 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
canvas 阴影和图形变换的示例代码
2018/01/02 HTML / CSS
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
质量提升方案
2014/06/16 职场文书
禁止酒驾标语
2014/06/25 职场文书
银行求职信模板
2015/03/20 职场文书
Java 死锁解决方案
2022/05/11 Java/Android
JS前端使用Canvas快速实现手势解锁特效
2022/09/23 Javascript