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使用PyFetion来发送短信的例子
Apr 22 Python
python将MongoDB里的ObjectId转换为时间戳的方法
Mar 13 Python
Python运用于数据分析的简单教程
Mar 27 Python
用于统计项目中代码总行数的Python脚本分享
Apr 21 Python
python杀死一个线程的方法
Sep 06 Python
Python实现的凯撒密码算法示例
Apr 12 Python
Python修改文件往指定行插入内容的实例
Jan 30 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
Apr 29 Python
python中pygame安装过程(超级详细)
Aug 04 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
Mar 10 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
Jun 18 Python
python和php哪个容易学
Jun 19 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编码规范之注释和文件结构说明
2010/07/09 PHP
php统计文件大小,以GB、MB、KB、B输出
2011/05/29 PHP
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
Codeigniter控制器controller继承问题实例分析
2016/01/19 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
使用jQuery设置disabled属性与移除disabled属性
2014/08/21 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
jquery使用animate方法实现控制元素移动
2015/03/27 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
MVC Ajax Helper或Jquery异步加载部分视图
2015/11/29 Javascript
Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
2016/06/23 Javascript
JavaScript中的事件委托及好处
2016/07/12 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
详解利用Angular实现多团队模块化SPA开发框架
2017/11/27 Javascript
关于vue单文件中引用路径的处理方法
2018/01/08 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python选择排序算法的实现代码
2013/11/21 Python
Python编写检测数据库SA用户的方法
2014/07/11 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
2018/02/21 Python
CentOS 7 安装python3.7.1的方法及注意事项
2018/11/01 Python
Python图像处理之gif动态图的解析与合成操作详解
2018/12/30 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
影视动画专业个人的自我评价
2013/12/31 职场文书
先进工作者事迹材料
2014/12/23 职场文书
党员违纪检讨书
2015/05/05 职场文书
2016廉洁从政心得体会
2016/01/19 职场文书
写自招自荐信的绝招!
2019/04/19 职场文书
请假条应该怎么写?
2019/06/24 职场文书
详细聊聊浏览器是如何看闭包的
2021/11/11 Javascript