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脚本实现格式化css文件
Apr 08 Python
python中map()与zip()操作方法
Feb 27 Python
Python实现对象转换为xml的方法示例
Jun 08 Python
Python 逐行分割大txt文件的方法
Oct 10 Python
python文本数据处理学习笔记详解
Jun 17 Python
Python OpenCV调用摄像头检测人脸并截图
Aug 20 Python
详解Python绘图Turtle库
Oct 12 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
Mar 06 Python
Python使用jupyter notebook查看ipynb文件过程解析
Jun 02 Python
如何使用PyCharm引入需要使用的包的方法
Sep 22 Python
python跨文件使用全局变量的实现
Nov 17 Python
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
Apr 21 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
人工智能开始玩《星际争霸2》 你的操作跟得上吗?
2017/08/11 星际争霸
桌面中心(一)创建数据库
2006/10/09 PHP
PHP生成静态页面详解
2006/12/05 PHP
默默小谈PHP&amp;MYSQL分页原理及实现
2007/01/02 PHP
php简单实现文件或图片强制下载的方法
2016/12/06 PHP
js简单的表格添加行和删除行操作示例
2014/03/31 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
2015/11/18 Javascript
Bootstrap Table使用整理(二)
2017/06/09 Javascript
关于在mongoose中填充外键的方法详解
2017/08/14 Javascript
Node.js应用设置安全的沙箱环境
2018/04/23 Javascript
vue-week-picker实现支持按周切换的日历
2019/06/26 Javascript
vue父子组件间引用之$parent、$children
2020/05/20 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
[50:01]Ti4 冒泡赛第二天 NEWBEE vs Titan
2014/07/15 DOTA
解决Python字典写入文件出行首行有空格的问题
2017/09/27 Python
Python3.5文件修改操作实例分析
2019/05/01 Python
django之使用celery-把耗时程序放到celery里面执行的方法
2019/07/12 Python
python3.7 openpyxl 删除指定一列或者一行的代码
2019/10/08 Python
pandas DataFrame运算的实现
2020/06/14 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
html5使用canvas绘制文字特效
2014/12/15 HTML / CSS
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
开工庆典邀请函范文
2014/01/16 职场文书
农业局学习党的群众路线教育实践活动心得体会
2014/03/07 职场文书
我的长生果教学反思
2014/04/28 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
先进教师个人总结
2015/02/11 职场文书
学困生转化工作总结
2015/08/13 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
发工资啦!教你用Python实现邮箱自动群发工资条
2021/05/10 Python
用React Native制作一个简单的游戏引擎
2021/05/27 Javascript
JavaScript实现外溢动态爱心的效果的示例代码
2022/03/21 Javascript
tomcat下部署jenkins的方法
2022/05/06 Servers
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers