Python下简易的单例模式详解


Posted in Python onApril 08, 2019

Python 下的单例模式

要点:

  1. 1.某个类只能有一个实例;
  2. 2.它必须自行创建这个实例;
  3. 3.它必须自行向整个系统提供这个实例

方法:重写new函数

应该考虑的情况:

  1. 1.这个单例的类可能继承了别的类
  2. 2.这个单例的类还有可能要接收参数来实例化

要点:

实例化的过程其实不是直接调用init的,首先是new分配一块空间来创建实例,再由init对这个实例进行初始化.我们无法阻止new和init的调用,我们只能是限制他们的内容,以此使他们能达到单例的目的

代码:

class people(object):
	def __new__(cls,*args,**kargs):
		return super(people,cls).__new__(cls)
	def __init__(self,name):
		self.name = name
		
	def talk(self):
		print("hello,I am %s" %self.name)
	
	
	
class student(people):
	def __new__(cls,*args,**kargs):
		if not hasattr(cls,"instance"):
			
			cls.instance = super(student,cls).__new__(cls,*args,**kargs)
		return cls.instance

a = student("Timo")
print(a)
b = student("kysa")
c = student("Luyi")
a.talk()
b.talk()
print(c)

这里的输出结果是:

<__main__.student object at 0x0000025AC48BF2E8>
hello,I am Luyi
hello,I am Luyi
<__main__.student object at 0x0000025AC48BF2E8>

可以确定的是: 确实是单例了,因为a的id和b,c的id是一致的

但是为什么:a先创建明明是Timo,可是为什么a的name变成了Luyi呢?

原因:
虽然确实是a这个实例,但是在最后c重新调用了new,返回了a的实例,再经过init,改变了a的属性,执行时name ->Luyi.

解决:
这种情况下,我们只需要设置类变量,让init在类变量的限制下,只对类进行一次有效的初始化.

代码:

class people(object):
	def __new__(cls,*args,**kargs):
		return super(people,cls).__new__(cls)
	def __init__(self,name):
		self.name = name
		
	def talk(self):
		print("hello,I am %s" %self.name)
	
	
	
class student(people):
	def __new__(cls,*args,**kargs):
		if not hasattr(cls,"instance"):
			cls.instance = super(student,cls).__new__(cls,*args,**kargs)
		return cls.instance
	def __init__(self,name):
		if not hasattr(self,"init_fir"):
			self.init_fir = True
			super(student,self).__init__(name)
a = student("Timo")
print(a)
b = student("kysa")
c = student("Luyi")
a.talk()
b.talk()
print(c)

好了,到这里就用Python实现了一个简易的单例模式.

以上所述是小编给大家介绍的Python下简易的单例模式详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
详解Python中__str__和__repr__方法的区别
Apr 17 Python
Python Matplotlib库入门指南
May 18 Python
Python基础中所出现的异常报错总结
Nov 19 Python
Python实现自动为照片添加日期并分类的方法
Sep 30 Python
python编程培训 python培训靠谱吗
Jan 17 Python
Django csrf 验证问题的实现
Oct 09 Python
Django框架用户注销功能实现方法分析
May 28 Python
python 在某.py文件中调用其他.py内的函数的方法
Jun 25 Python
从列表或字典创建Pandas的DataFrame对象的方法
Jul 06 Python
react+django清除浏览器缓存的几种方法小结
Jul 17 Python
Python 画出来六维图
Jul 26 Python
Python程序暂停的正常处理方法
Nov 07 Python
Python字符串的常见操作实例小结
Apr 08 #Python
Python面向对象程序设计多继承和多态用法示例
Apr 08 #Python
python仿抖音表白神器
Apr 08 #Python
Python面向对象程序设计之私有属性及私有方法示例
Apr 08 #Python
分析经典Python开发工程师面试题
Apr 08 #Python
django celery redis使用具体实践
Apr 08 #Python
python制作抖音代码舞
Apr 07 #Python
You might like
php中将网址转换为超链接的函数
2011/09/02 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
jqGrid随窗口大小变化自适应大小的示例代码
2013/12/28 Javascript
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
2014/08/15 Javascript
js仿3366小游戏选字游戏
2016/04/14 Javascript
纯JS代码实现一键分享功能
2016/04/20 Javascript
JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析
2016/05/24 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
2016/06/08 Javascript
Javascript数组中push方法用法分析
2016/10/31 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
js实现数组和对象的深浅拷贝
2017/09/30 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
详解React路由传参方法汇总记录
2020/11/29 Javascript
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
python+tkinter实现学生管理系统
2019/08/20 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
keras实现多种分类网络的方式
2020/06/11 Python
英国知名衬衫品牌美国网站:Charles Tyrwhitt美国
2016/08/28 全球购物
Woolworth官网:澳洲第一大超市
2017/06/25 全球购物
BRASTY捷克:购买香水、化妆品、手袋和手表
2017/07/12 全球购物
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
汽车技术服务与营销专业在籍生自荐信
2013/09/28 职场文书
如何客观的进行自我评价
2013/12/17 职场文书
函授教育个人学习的自我评价
2013/12/31 职场文书
安全演讲稿大全
2014/05/09 职场文书
模具设计与制造专业自荐书
2014/07/01 职场文书
工伤死亡理赔协议书
2014/10/20 职场文书
防汛通知
2015/04/25 职场文书
2019年圣诞节祝福语集锦
2019/12/25 职场文书
SQLServer2019 数据库环境搭建与使用的实现
2021/04/08 SQL Server
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python
使用 Apache 反向代理的设置技巧
2022/01/18 Servers
springcloud整合seata
2022/05/20 Java/Android