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中django框架通过正则搜索页面上email地址的方法
Mar 21 Python
Python中每次处理一个字符的5种方法
May 21 Python
python妹子图简单爬虫实例
Jul 07 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
Oct 18 Python
对Python 网络设备巡检脚本的实例讲解
Apr 22 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
Dec 19 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
Nov 07 Python
django 数据库 get_or_create函数返回值是tuple的问题
May 15 Python
python drf各类组件的用法和作用
Jan 12 Python
pytorch实现线性回归以及多元回归
Apr 11 Python
python爬取豆瓣电影TOP250数据
May 23 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批量采集下载美女图片的实现代码
2013/06/03 PHP
php计算title标题相似比的方法
2015/07/29 PHP
php数组指针函数功能及用法示例
2020/02/11 PHP
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
深入理解JavaScript系列(12) 变量对象(Variable Object)
2012/01/16 Javascript
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
以Python代码实例展示kNN算法的实际运用
2015/10/26 Javascript
Backbone.js框架中Model与Collection的使用实例
2016/05/07 Javascript
EditPlus中的正则表达式 实战(2)
2016/12/15 Javascript
Json按某个键的值进行排序
2016/12/22 Javascript
js 输入框 正则表达式(菜鸟必看教程)
2017/02/19 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
使用vue-aplayer插件时出现的问题的解决
2018/03/02 Javascript
利用jqgrid实现上移下移单元格功能
2018/11/07 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
JS实现小米轮播图
2020/09/21 Javascript
vue实现图片裁剪后上传
2020/12/16 Vue.js
python字符串str和字节数组相互转化方法
2017/03/18 Python
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
详解python单元测试框架unittest
2018/07/02 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
python读取txt文件中特定位置字符的方法
2018/12/24 Python
Python内置加密模块用法解析
2019/11/25 Python
python中安装django模块的方法
2020/03/12 Python
Python绘制动态水球图过程详解
2020/06/03 Python
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
蒂娜商店:Tiina the Store
2019/12/07 全球购物
C语言编程题
2015/03/09 面试题
大学生开西餐厅创业计划书
2014/02/01 职场文书
会计学生自我鉴定
2014/02/06 职场文书
2014大学生全国两会学习心得体会
2014/03/13 职场文书
今冬明春火灾防控工作方案
2014/05/29 职场文书
员工工作及收入证明
2014/10/28 职场文书
上市公司董事长岗位职责
2015/04/16 职场文书