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让图片按照exif信息里的创建时间进行排序的方法
Mar 16 Python
Python进程通信之匿名管道实例讲解
Apr 11 Python
Python 和 JS 有哪些相同之处
Nov 23 Python
python中Apriori算法实现讲解
Dec 10 Python
Python进度条实时显示处理进度的示例代码
Jan 30 Python
python字典值排序并取出前n个key值的方法
Oct 17 Python
为什么Python中没有"a++"这种写法
Nov 27 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
Nov 30 Python
分享一个pycharm专业版安装的永久使用方法
Sep 24 Python
Jupyter Notebook的连接密码 token查询方式
Apr 21 Python
Python入门之使用pandas分析excel数据
May 12 Python
Python 文字识别
May 11 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以ROOT权限执行系统命令的方法
2011/02/10 PHP
Apache中php.ini的设置方法
2013/02/28 PHP
PHP使用CURL_MULTI实现多线程采集的例子
2014/07/29 PHP
PHP实现简单数字分页效果
2015/07/26 PHP
laravel实现按月或天或小时统计mysql数据的方法
2019/10/09 PHP
javascript document.images实例
2008/05/27 Javascript
使用Grunt.js管理你项目的应用说明
2013/04/24 Javascript
JavaScript极简入门教程(一):基础篇
2014/10/25 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
jQuery Validate插件实现表单强大的验证功能
2015/12/18 Javascript
jQuery仿京东商城楼梯式导航定位菜单
2016/07/25 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
jQuery+vue.js实现的多选下拉列表功能示例
2019/01/15 jQuery
ES11屡试不爽的新特性,你用上了几个
2020/10/21 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
使用node-media-server搭建一个简易的流媒体服务器
2021/01/20 Javascript
python中字典dict常用操作方法实例总结
2015/04/04 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
Python实现的直接插入排序算法示例
2018/04/29 Python
Python中pip更新和三方插件安装说明
2018/07/08 Python
详解PyCharm+QTDesigner+PyUIC使用教程
2019/06/13 Python
快速解释如何使用pandas的inplace参数的使用
2020/07/23 Python
把富文本的回车转为br标签
2019/08/09 HTML / CSS
大学毕业后的十年规划
2014/01/07 职场文书
读书演讲主持词
2014/03/18 职场文书
政治表现评语
2014/05/04 职场文书
师德师风承诺书
2014/05/23 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
公安领导班子四风问题个人整改措施思想汇报
2014/10/09 职场文书
小兵张嘎观后感300字
2015/06/03 职场文书
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis