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里对list中的整数求平均并排序
Sep 12 Python
Python中处理字符串之isalpha()方法的使用
May 18 Python
python使用PyGame模块播放声音的方法
May 20 Python
简单讲解Python中的闭包
Aug 11 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
Python动态语言与鸭子类型详解
Jul 01 Python
django 多对多表的创建和插入代码实现
Sep 09 Python
python3.7环境下安装Anaconda的教程图解
Sep 10 Python
Python随机数函数代码实例解析
Feb 09 Python
Python requests获取网页常用方法解析
Feb 20 Python
python爬虫实现获取下一页代码
Mar 13 Python
全网非常详细的pytest配置文件
Jul 15 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
10条PHP编程习惯助你找工作
2008/09/29 PHP
逆序二维数组插入一元素的php代码
2012/06/08 PHP
php查询mssql出现乱码的解决方法
2014/12/29 PHP
JavaScript中void(0)的具体含义解释
2007/02/27 Javascript
javascript 面向对象编程基础:继承
2009/08/21 Javascript
js中判断文本框是否为空的两种方法
2011/07/31 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
微信小程序 动态绑定事件并实现事件修改样式
2017/04/13 Javascript
vue.js组件vue-waterfall-easy实现瀑布流效果
2017/08/22 Javascript
深入理解Vue keep-alive及实践总结
2019/08/21 Javascript
解决layui laydate 时间控件一闪而过的问题
2019/09/28 Javascript
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
js Math数学简单使用操作示例
2020/03/13 Javascript
python字典get()方法用法分析
2015/04/17 Python
Python实现求数列和的方法示例
2018/01/12 Python
用python拟合等角螺线的实现示例
2019/12/27 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
python MD5加密的示例
2020/10/19 Python
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
瑞士香水购物网站:Parfumcity.ch
2017/01/14 全球购物
德国购买踏板车网站:Microscooter
2019/10/14 全球购物
国际金融专业大学生职业生涯规划书
2013/12/28 职场文书
生产班组长岗位职责
2014/01/05 职场文书
火锅店创业计划书范文
2014/02/02 职场文书
《吃水不忘挖井人》教学反思
2014/04/15 职场文书
党员干部一句话承诺
2014/05/30 职场文书
生产车间标语
2014/06/11 职场文书
加强作风建设工作总结
2014/10/23 职场文书
2014年党员发展工作总结
2014/12/02 职场文书
2015年医院科室工作总结范文
2015/05/26 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书
导游词之山海关
2019/12/10 职场文书