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 22 Python
Python中使用tarfile压缩、解压tar归档文件示例
Apr 05 Python
python实现mysql的单引号字符串过滤方法
Nov 14 Python
Python 读取指定文件夹下的所有图像方法
Apr 27 Python
python实现傅里叶级数展开的实现
Jul 21 Python
Python设计模式之桥接模式原理与用法实例分析
Jan 10 Python
解决PyCharm控制台输出乱码的问题
Jan 16 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
Apr 12 Python
Django框架序列化与反序列化操作详解
Nov 01 Python
pytorch实现MNIST手写体识别
Feb 14 Python
python实现人脸签到系统
Apr 13 Python
Python编写车票订购系统 Python实现快递收费系统
Aug 14 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和ACCESS写聊天室(八)
2006/10/09 PHP
php max_execution_time执行时间问题
2011/07/17 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
详解php几行代码实现CSV格式文件输出
2017/07/01 PHP
jquery 可拖拽的窗体控件实现代码
2010/03/21 Javascript
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
js动态给table添加/删除tr的方法
2013/08/02 Javascript
jquery制作弹窗提示窗口代码分享
2014/03/02 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
jquery验证邮箱格式并显示提交按钮
2015/11/07 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
AngularJS 视图详解及示例代码
2016/08/17 Javascript
快速掌握jQuery插件开发
2017/01/19 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
vue-cli脚手架config目录下index.js配置文件的方法
2018/03/13 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
2019/11/14 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
2020/02/27 Javascript
vue解决跨域问题(推荐)
2020/11/10 Javascript
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
Python编程实现使用线性回归预测数据
2017/12/07 Python
Python实现针对给定单链表删除指定节点的方法
2018/04/12 Python
python实现事件驱动
2018/11/21 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
世界上最大的各式箱包网络零售店:eBag
2016/07/21 全球购物
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
2016新年感言
2015/08/03 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书
不知如何爱孩子,这些方法教会您
2019/08/06 职场文书
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis
python中如何对多变量连续赋值
2021/06/03 Python
详解Nginx的超时keeplive_timeout配置步骤
2022/05/25 Servers
MySQL普通表如何转换成分区表
2022/05/30 MySQL
Windows Server 修改远程桌面端口的实现
2022/06/25 Servers