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中使用正则表达式的方法
Aug 13 Python
使用python编写监听端
Apr 12 Python
使用python 3实现发送邮件功能
Jun 15 Python
python统计多维数组的行数和列数实例
Jun 23 Python
Python中flatten( )函数及函数用法详解
Nov 02 Python
python使用参数对嵌套字典进行取值的方法
Apr 26 Python
基于python的Paxos算法实现
Jul 03 Python
对Pytorch神经网络初始化kaiming分布详解
Aug 18 Python
Python字典生成式、集合生成式、生成器用法实例分析
Jan 07 Python
PyCharm配置anaconda环境的步骤详解
Jul 31 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 Python
Python下opencv库的安装过程及问题汇总
Jun 11 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
服务器端解压缩zip的脚本
2006/12/22 PHP
php仿ZOL分页类代码
2008/10/02 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
2016/10/17 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
PHP基于递归算法解决兔子生兔子问题
2018/05/11 PHP
thinkPHP+LayUI 流加载实现功能
2019/09/27 PHP
splice slice区别
2006/10/09 Javascript
24款非常有用的 jQuery 插件分享
2011/04/06 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
jquery使用$(element).is()来判断获取的tagName
2014/08/24 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
vue+iview写个弹框的示例代码
2017/12/05 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
Vue.js暴露方法给WebView的使用操作
2020/09/07 Javascript
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
2017/06/14 Python
Numpy截取指定范围内的数据方法
2018/11/14 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
2020/03/18 Python
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
苹果香港官方商城:Apple香港
2016/09/14 全球购物
新奥尔良珠宝:Mignon Faget
2020/11/23 全球购物
Unix如何添加新的用户
2014/08/20 面试题
小学教师节活动方案
2014/01/31 职场文书
公司薪酬管理制度
2014/01/31 职场文书
企业军训感想
2014/02/07 职场文书
报关报检委托书
2014/04/08 职场文书
课外访万家心得体会
2014/09/03 职场文书
党员干部反四风民主生活会对照检查材料思想汇报
2014/10/12 职场文书
社区三八妇女节活动总结
2015/02/06 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
python flask框架快速入门
2021/05/14 Python
MySQL触发器的使用
2021/05/24 MySQL