Python3 实现单例设计模式
时间:2022-07-28
本文章向大家介绍Python3 实现单例设计模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
单例模式的一般实现
饿汉式
懒汉式就是通过一个方法才能实现单例,我不是很常用,所以在此就写个饿汉式。以后再补懒汉式。 单例模式的核心作用是保证一个类只有一个该类型的对象。在一个对象被过多调用时避免过多的消耗内存,即可使用单例模式。
在python中新建一个对象会调用 __new__
方法为创建的对象分配其内存空间,并且返回该对象的引用,随后将会传给 __init__
函数进行实例化。
一般情况下并不需要调用 new 方法,当使用单例时这一步是必要的。在重写 new 方法时需要返回当前实例的类 cls :return super().__new__(cls)
。得到了分配的内存空间引用后,开始为对象进行实例化,代码可以简单的写为如下:
class ClassObj(object):
def __new__(cls):
print("进行分配内存")
return super().__new__(cls)
def __init__(self):
print("开始初始化")
cobj = ClassObj()
运行结果如下:
但是以上的代码并没有实现单例模式,这个时候,我们需要对以上代码进行更改。 在使用 new 方法时判断是否已经被实例化:
class ClassObj(object):
instance=None
def __new__(cls):
if cls.instance is None:
cls.instance=super().__new__(cls)
print("进行分配内存")
else:
print("已经分配了")
return cls.instance
def __init__(self):
print("已经分配了")
cobj = ClassObj()
cobj1 = ClassObj()
以上代码在ClassObj中,定义了一个成员变量 instance,用来存储分配的空间引用,并且在__new__方法中最后return instance;假设第一次新建该类对象,instance为None则会进行实例化,假设不为None,则会提示已经分配了,不会再次分配空间,进行创建。运行结果如下:
以上结果只在第一次新建对象时分配了空间,之后创建对象并没有新建空间。 这时也可以直接输出类对象查看空间:
cobj = ClassObj()
cobj1 = ClassObj()
print(cobj)
print(cobj1)
结果如下是相同的:
- 【Golang语言社区】LollipopGo框架之商城项目--路由设置
- "LollipopGo/library/lollipop/common" 测试3
- "LollipopGo/library/lollipop/common" 测试2
- Golang语言并发技术详解
- Golang语言社区--Go基础课程第一节聊聊Go语言
- Spring boot with ELK(Elasticsearch + Logstash + Kibana)
- 数据库与缓存
- 通过 Proxy 汉化 restful 接口
- 学习笔记CB005:关键词、语料提取
- Eclipse油藏模型解析程序
- DBA生存警示:保护现场不要让事情更糟
- 爬虫快速入门
- “零基础学编程”都需要哪些基础?
- 零基础学编程008:print语句
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- springboot消息之@RabbitListener和@EnableRabbit
- c++实例之通讯录管理系统之显示菜单和退出功能(一)
- c++实例之通讯录管理系统之添加联系人功能(二)
- c++实例之通讯录管理系统之显示联系人功能(三)
- c++实例之通讯录管理系统之删除联系人功能(四)
- springboot检索之Elasticsearch简介
- c++实例之通讯录管理系统之查找联系人功能(五)
- 【python-leetcode424-滑动窗口法】替换后的最长重复字符
- c++实例之通讯录管理系统之修改联系人功能(六)
- 解决arxiv.org打开pdf缓慢问题
- c++实例之通讯录管理系统之清空联系人功能(七)
- springboot任务之定时任务
- springboot检索之整合elasticsearch并使用jest操作
- springboot任务之邮件任务
- springboot安全之整合spring security实现(只有登录才有权限、不同用户显示不同内容、记住我)