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版本的按任意键继续/退出
Sep 26 Python
Python 模块EasyGui详细介绍
Feb 19 Python
Python 数据结构之旋转链表
Feb 25 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
May 23 Python
python利用有道翻译实现"语言翻译器"的功能实例
Nov 14 Python
酷! 程序员用Python带你玩转冲顶大会
Jan 17 Python
Pandas分组与排序的实现
Jul 23 Python
Django 对象关系映射(ORM)源码详解
Aug 06 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
Aug 27 Python
Python对称的二叉树多种思路实现方法
Feb 28 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
Jul 07 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
Oct 02 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
PHILIPS AE3805收音机的分析打磨
2021/03/02 无线电
PHP性能优化准备篇图解PEAR安装
2011/12/05 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
php三种实现多线程类似的方法
2015/10/30 PHP
如何在指定的地方插入html内容和文本内容
2013/12/23 Javascript
JavaScript+CSS控制打印格式示例介绍
2014/01/07 Javascript
NODE.JS加密模块CRYPTO常用方法介绍
2014/06/05 Javascript
Google Maps API地图应用示例分享
2014/10/23 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
Javascript es7中比较实用的两个方法示例
2017/07/21 Javascript
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
JS实现扫码枪扫描二维码功能
2020/01/03 Javascript
微信小程序实现简单购物车功能
2020/12/30 Javascript
python基于右递归解决八皇后问题的方法
2015/05/25 Python
JSON Web Tokens的实现原理
2017/04/02 Python
Python3导入自定义模块的三种方法详解
2018/04/13 Python
Django如何配置mysql数据库
2018/05/04 Python
python3 打开外部程序及关闭的示例
2018/11/06 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
Python3内置模块random随机方法小结
2019/07/13 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
英国最大的独立家具零售商:Furniture Village
2016/09/06 全球购物
美国最大的骑马用品零售商:HorseLoverZ
2017/01/12 全球购物
药学专业毕业生求职信
2013/10/20 职场文书
园林施工员岗位职责
2013/12/11 职场文书
门诊手术室工作制度
2014/01/30 职场文书
付款委托书范本
2014/04/04 职场文书
大学英语专业求职信
2014/06/21 职场文书
涪陵白鹤梁导游词
2015/02/09 职场文书
幼儿园亲子活动通知
2015/04/24 职场文书
公司处罚决定书
2015/06/24 职场文书
校长新学期寄语2016
2015/12/04 职场文书
详解Python常用的魔法方法
2021/06/03 Python
MySQL 原理与优化之原数据锁的应用
2022/08/14 MySQL