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 isinstance判断对象类型
Sep 06 Python
Python 命令行非阻塞输入的小例子
Sep 27 Python
Python3.4编程实现简单抓取爬虫功能示例
Sep 14 Python
Python快速排序算法实例分析
Nov 29 Python
python爬虫之自动登录与验证码识别
Jun 15 Python
python求质数的3种方法
Sep 28 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
Jan 03 Python
Python数据可视化:顶级绘图库plotly详解
Dec 07 Python
使用python-opencv读取视频,计算视频总帧数及FPS的实现
Dec 10 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
Python生成词云的实现代码
Jan 14 Python
Python猴子补丁Monkey Patch用法实例解析
Mar 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 array数组的教程详解
2013/06/05 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
Thinkphp微信公众号支付接口
2016/08/04 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
2017/11/20 PHP
双击滚屏-常用推荐
2006/11/29 Javascript
JavaScript方法和技巧大全
2006/12/27 Javascript
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
2009/10/29 Javascript
Notify - 基于jquery的消息通知插件
2011/10/18 Javascript
JavaScript如何禁止Backspace键
2015/12/02 Javascript
Javascript 函数的四种调用模式
2016/11/05 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
vue生成文件本地打开查看效果的实例
2018/09/06 Javascript
JavaScript实现的滚动公告特效【基于jQuery】
2019/07/10 jQuery
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
python如何实现内容写在图片上
2018/03/23 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
python检测服务器端口代码实例
2019/08/31 Python
解决python replace函数替换无效问题
2020/01/18 Python
浅谈keras 模型用于预测时的注意事项
2020/06/27 Python
Python如何操作docker redis过程解析
2020/08/10 Python
公司财务总监岗位职责
2013/12/14 职场文书
物业保安主管岗位职责
2013/12/25 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
色戒观后感
2015/06/12 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书
教师研修随笔感言
2015/11/18 职场文书
Python 处理表格进行成绩排序的操作代码
2021/07/26 Python
mysql幻读详解实例以及解决办法
2022/06/16 MySQL