python学习【第十篇】单例设计模式
单例设计模式
目的:让类创建对象,在系统中只有唯一的实例,让每一次创建的对象返回的内存地址都是相同的。
__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学习【第十篇】单例设计模式的更多相关文章
- Python 学习 第十篇 CMDB用户权限管理
Python 学习 第十篇 CMDB用户权限管理 2016-10-10 16:29:17 标签: python 版权声明:原创作品,谢绝转载!否则将追究法律责任. 不管是什么系统,用户权限都是至关重要 ...
- Python 学习 第十篇:正则表达式 - re
规则表达式(Regular Expression, RE),又称作正则表达式,通常用于检索.替换符合指定规则的文本,正则表达式定义的规则,称作模式(Pattern),即正则表达式的作用是从文本中查找到 ...
- Python学习第十篇——函数初步
def make_album(name,album_name,song_nums = 1): dict_album = {name:[album_name]} if int(song_nums) &g ...
- python学习第十篇——while 的灵活运用
sandwiches_orders = ['apple','banana','mango',"apple","watermelon"] finished_san ...
- Java学习笔记(二十四):单例设计模式singleton
为什么要使用singleton设计模式? 假设设计了一个操作数组的工具类(Tools),里面有一个锤子的方法(Hammer),如果不使用singleton设计模式,每次想调用Hammer方法都需要ne ...
- JAVA学习第二十五课(多线程(四))- 单例设计模式涉及的多线程问题
一.多线程下的单例设计模式 利用双重推断的形式解决懒汉式的安全问题和效率问题 //饿汉式 /*class Single { private static final Single t = new Si ...
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...
- 基于PO和单例设计模式用python+selenium进行ui自动化框架设计
一)框架目录的结构 二)config包当中的config.ini文件主要是用来存项目的绝对路径,是为了后续跑用例和生成测试报告做准备然后目前的配置文件大都会用yaml,ini,excel,还有.py也 ...
- python小总结3(异常、单例设计模式)
一.异常 AttributeError:试图访问一个对象没有的成员[属性和方法] ValueError:值错误,传入了一个不期望的值 ImportError:无法导入模块或者包:基本上路径问题 Ind ...
随机推荐
- 使用Python发送电子邮件
使用python发送邮件并不难,这里使用的是SMTP协议. Python标准库中内置了smtplib,使用它发送邮件只需提供邮件内容与发送者的凭证即可. 代码如下: # coding:utf-8 im ...
- Git学习资源推荐
Git在线练习 http://pcottle.github.io/learnGitBranching/ https://try.github.io/levels/1/challenges/1 Git入 ...
- POJ3525-Most Distant Point from the Sea(二分+半平面交)
Most Distant Point from the Sea Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3955 ...
- 解决C#使用Microsoft.Office.Interop.Excel操作Excel后进程一直存在的问题
This resolved the issue for me. Your code becomes: public Excel.Application excelApp = new Excel.App ...
- spring mvc跨域设置(全局)
//--------------第一步//spring 5版本全局配置方式 @Configuration @EnableWebMvc public class SpringMvcBeans imple ...
- VC 使用json cpp 静态库 问题解决
release使用 json 静态库 提示 fatal error C1083: 无法打开编译器生成的文件:“../../build/vs71/release/lib_json\json_writer ...
- Easy Explore插件:在eclipse里快速打开文件所在的目录
下载:easyexplore_1.0.4 安装:把文件”org.sf.easyexplore_1.0.4.jar”文件解压出来,然后复制到eclipse安装目录的”plugins”文件夹里 http: ...
- 预装WIN8改装WIN7之BIOS设置
不少预装WIN8/10的朋友觉得WIN8/10不好用,想改装WIN7,可改装之后常常出现各种问题,甚至不能启动,往往是BIOS设置不当. 本文以联想小新V2000 预装WIN8.1中文版为例,说说WI ...
- shell脚本与mongo交互
1.mongo提供*.js的方法供linux调用 #!/bin/bash /usr/local/mongodb/bin/mongo hostname/dbname xxx.js xxx.js 内容如下 ...
- webpack 通用环境快速搭建
能用babel编译es2015 . 能热编译.能加载静态资源(js/css/font/image).是一个很通用的开发环境,虽然不智能.但很好扩展 npm 安装列表: # webpack 核心 npm ...