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 28 Python
python实现用户登陆邮件通知的方法
Jul 09 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
Aug 08 Python
Python实现随机创建电话号码的方法示例
Dec 07 Python
python构建基础的爬虫教学
Dec 23 Python
解决Django生产环境无法加载静态文件问题的解决
Apr 23 Python
Python爬虫爬取煎蛋网图片代码实例
Dec 16 Python
pytorch:torch.mm()和torch.matmul()的使用
Dec 27 Python
使用python自动追踪你的快递(物流推送邮箱)
Mar 17 Python
Tensorflow实现将标签变为one-hot形式
May 22 Python
python中xlrd模块的使用详解
Feb 01 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
Mar 03 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 面向对象实现代码
2009/11/11 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
Drupal简体中文语言包安装教程
2014/09/27 PHP
PHP中$_SERVER使用说明
2015/07/05 PHP
PHP可变变量学习小结
2015/11/29 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
2019/10/17 PHP
用Javascript评估用户输入密码的强度(Knockout版)
2011/11/30 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
jQuery中的jQuery()方法用法分析
2014/12/27 Javascript
Bootstrap开发实战之第一次接触Bootstrap
2016/06/02 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
vue中锚点的三种方法
2018/07/06 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
基于Vue 实现一个中规中矩loading组件
2019/04/03 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
2019/09/28 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
2020/03/25 Javascript
[02:06]DOTA2英雄基础教程 暗影萨满
2013/12/16 DOTA
python网络编程学习笔记(三):socket网络服务器
2014/06/09 Python
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
pandas 将list切分后存入DataFrame中的实例
2018/07/03 Python
python 导入数据及作图的实现
2019/12/03 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
使用Python内置模块与函数进行不同进制的数的转换
2020/04/26 Python
Python 实现国产SM3加密算法的示例代码
2020/09/21 Python
星空联盟C# .net笔试题
2014/12/05 面试题
Shell如何接收变量输入
2016/08/06 面试题
打架检讨书300字
2014/02/02 职场文书
制作部班长职位说明书
2014/02/26 职场文书
教师反邪教心得体会
2016/01/15 职场文书
详解Html5项目适配系统深色模式方案总结
2021/04/14 HTML / CSS
Django drf请求模块源码解析
2021/06/08 Python