单例设计模式

目的:让类创建对象,在系统中只有唯一的实例,让每一次创建的对象返回的内存地址都是相同的。

__new__方法

使用类名创建对象时,python解释器首先会调用__new__方法为对象分配空间

__new__方法是有object基类提供的静态方法,主要作用有两个:

  • 为内存中的对象分配空间
  • 返回对象的引用,python解释器获得引用后会作为第一个参数返回给__init__方法

python中的单例:

  • __new__方法只创建一次空间,返回一次引用
  • __init___方法只初始化一次

所以,在python中实现单例需要重写__new__方法,python中重写__new__方法非常固定,必须要返回return super().__new__(cls),否则解释器就得不到对象的引用就不会调用初始化方法,如图:

python中单例的实现方式:

  • 定义一个 类属性,初始值是 None,用于记录 单例对象的引用
  • 重写__new__方法
  • 如果 类属性 is None,调用父类方法分配空间,并在类属性中记录结果
  • 返回 类属性 中记录的 对象引用
  • 让初始化工作只执行一次

示例代码如下:

class Single(object):

    instance = None

    init_flag = False

    def __new__(cls, *args, **kwargs):

        if cls.instance is None:

            cls.instance = super().__new__(cls)

        return cls.instance

    def __init__(self):

        if not Single.init_flag:

            print("初始化对象")

            Single.init_flag = True

s1 = Single()
s2 = Single()

print(s1)
print(s2)

  

执行结果:

初始化对象
<__main__.Single object at 0x7f4d032f1d68>
<__main__.Single object at 0x7f4d032f1d68>

  

python学习【第十篇】单例设计模式的更多相关文章

  1. Python 学习 第十篇 CMDB用户权限管理

    Python 学习 第十篇 CMDB用户权限管理 2016-10-10 16:29:17 标签: python 版权声明:原创作品,谢绝转载!否则将追究法律责任. 不管是什么系统,用户权限都是至关重要 ...

  2. Python 学习 第十篇:正则表达式 - re

    规则表达式(Regular Expression, RE),又称作正则表达式,通常用于检索.替换符合指定规则的文本,正则表达式定义的规则,称作模式(Pattern),即正则表达式的作用是从文本中查找到 ...

  3. Python学习第十篇——函数初步

    def make_album(name,album_name,song_nums = 1): dict_album = {name:[album_name]} if int(song_nums) &g ...

  4. python学习第十篇——while 的灵活运用

    sandwiches_orders = ['apple','banana','mango',"apple","watermelon"] finished_san ...

  5. Java学习笔记(二十四):单例设计模式singleton

    为什么要使用singleton设计模式? 假设设计了一个操作数组的工具类(Tools),里面有一个锤子的方法(Hammer),如果不使用singleton设计模式,每次想调用Hammer方法都需要ne ...

  6. JAVA学习第二十五课(多线程(四))- 单例设计模式涉及的多线程问题

    一.多线程下的单例设计模式 利用双重推断的形式解决懒汉式的安全问题和效率问题 //饿汉式 /*class Single { private static final Single t = new Si ...

  7. JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

    JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...

  8. 基于PO和单例设计模式用python+selenium进行ui自动化框架设计

    一)框架目录的结构 二)config包当中的config.ini文件主要是用来存项目的绝对路径,是为了后续跑用例和生成测试报告做准备然后目前的配置文件大都会用yaml,ini,excel,还有.py也 ...

  9. python小总结3(异常、单例设计模式)

    一.异常 AttributeError:试图访问一个对象没有的成员[属性和方法] ValueError:值错误,传入了一个不期望的值 ImportError:无法导入模块或者包:基本上路径问题 Ind ...

随机推荐

  1. ant-design 实现 添加页面

    1.逻辑代码 /** * 添加用户 */ import React,{PureComponent} from 'react' import {Card,Form,Input,Select,Button ...

  2. JDK自带监控工具 jps、jinfo、jstat、jmap、jconsole

    分类: JVM 2010-10-04 11:05 587人阅读 评论(0) 收藏 举报 工具jdkjava远程连接unixstring 常用有五个命令行工具: jinfo: 可以输出并修改运行时的ja ...

  3. VMware12.0下安装CentOS-6.9-x86_64-bin-DVD.iso

    使用的是vmware workstation 12 pro 创建虚拟机 注意上面的 安装程序光盘镜象文件(iso)(M): 是我之前配置,现在可以不做任何处理 此处使用的是centos的64位 在创建 ...

  4. Android Volley框架的几种post提交请求方式

    首先简单描述一下Google的Android开发团队在2013年推出的一个网络通信框架Volley.它的设计目标是进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如下载文件等,Vol ...

  5. tcpdump抓包(转)

    Linux 环境下,通常通过 tcpdump 来进行抓包和分析.它是几乎所有 Linux 发行版本预装的数据包抓取和分析工具. tcpdump 工具的获取和安装可以参阅相应操作系统的官方文档,本文不再 ...

  6. 转:[windows]DOS批处理添加任务计划

    自动创建每周运行一次的计划任务 创建计划任务可用at,schtasks命令,schtasks提供了很多参数 命令schtasks SCHTASKS /Create [/S system [/U use ...

  7. unity, Invoke延迟执行

    参考:http://blog.christianhenschel.com/2013/05/15/how-to-do-delayed-function-calls-in-unity3d-one-line ...

  8. unity, iOS集成微信

    将微信sdk直接拖进xcode会导致Library Search Paths是错的,需要手动改成如下样子(蓝色选中部分)才能通过编译:

  9. 字符串函数---strcmp()与strncmp()具体解释及实现

    一.strcmp()与strncmp() strcmp():strcmp(s1,s2);            比較两个字符串.        strncmp():strncmp(s1,s2);   ...

  10. shell脚本之read工具

    #!/bin/bash # -*- coding: utf-8 -*- # echo -n "please input your name: " read name echo &q ...