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时区设置方法与pytz查询时区教程
Nov 27 Python
Python实现多线程下载文件的代码实例
Jun 01 Python
分析Python读取文件时的路径问题
Feb 11 Python
Python批量提取PDF文件中文本的脚本
Mar 14 Python
Django项目中用JS实现加载子页面并传值的方法
May 28 Python
PyQt5 QTable插入图片并动态更新的实例
Jun 18 Python
python分数表示方式和写法
Jun 26 Python
Django REST framwork的权限验证实例
Apr 02 Python
python多进程下的生产者和消费者模型
May 07 Python
Python3中的tuple函数知识点讲解
Jan 03 Python
python爬虫scrapy框架之增量式爬虫的示例代码
Feb 26 Python
Python常遇到的错误和异常
Nov 02 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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
php cookie使用方法学习笔记分享
2013/11/07 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
2014/11/18 PHP
PhpStorm terminal无法输入命令的解决方法
2016/10/09 PHP
php实现产品加入购物车功能(1)
2020/07/23 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
jquery 学习笔记一
2010/04/07 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
2014/08/05 Javascript
JavaScript语言对Unicode字符集的支持详解
2014/12/30 Javascript
jquery表单对象属性过滤选择器实例分析
2015/05/18 Javascript
jQuery+HTML5美女瀑布流布局实现方法
2015/09/21 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
2015/12/07 Javascript
js中遍历Map对象的方法
2016/07/27 Javascript
node.js基于mongodb的搜索分页示例
2017/01/22 Javascript
jQuery解析json格式数据示例
2018/09/01 jQuery
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
[00:52]DOTA2齐天大圣预告片
2016/08/13 DOTA
python的迭代器与生成器实例详解
2014/07/16 Python
Python中title()方法的使用简介
2015/05/20 Python
python基于右递归解决八皇后问题的方法
2015/05/25 Python
详解用TensorFlow实现逻辑回归算法
2018/05/02 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
Python中Proxypool库的安装与配置
2018/10/19 Python
解决Django中多条件查询的问题
2019/07/18 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
2020/01/13 Python
餐厅考勤管理制度
2014/01/28 职场文书
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书
2014年城市管理工作总结
2014/12/02 职场文书
运动会800米赞词
2015/07/22 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL