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 相关文章推荐
使用C语言来扩展Python程序和Zope服务器的教程
Apr 14 Python
使用Python脚本来控制Windows Azure的简单教程
Apr 16 Python
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
Feb 18 Python
使用Python3 编写简单信用卡管理程序
Dec 21 Python
python3实现ftp服务功能(服务端 For Linux)
Mar 24 Python
Python简单爬虫导出CSV文件的实例讲解
Jul 06 Python
Python实现对文件进行单词划分并去重排序操作示例
Jul 10 Python
Python实例方法、类方法、静态方法的区别与作用详解
Mar 25 Python
Python 通过打码平台实现验证码的实现
May 13 Python
python基于opencv检测程序运行效率
Dec 28 Python
python高阶函数map()和reduce()实例解析
Mar 16 Python
一文轻松掌握python语言命名规范规则
Jun 18 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的宝库目录--PEAR
2006/10/09 PHP
PHP实现图片批量打包下载功能
2017/03/01 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
Jquery 表单取值赋值的一些基本操作
2009/10/11 Javascript
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
使用js显示当前时间示例
2014/03/02 Javascript
JS将光标聚焦在文本最后的实现代码
2014/03/28 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
深入理解JavaScript系列(30):设计模式之外观模式详解
2015/03/03 Javascript
BootStrap中的table实现数据填充与分页应用小结
2016/05/26 Javascript
js实现上传图片预览方法
2016/10/25 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
详解nodejs的express如何自动生成项目框架
2017/07/12 NodeJs
JS中的回调函数实例浅析
2018/03/21 Javascript
详解如何解决Vue和vue-template-compiler版本之间的问题
2018/09/17 Javascript
详解JavaScript栈内存与堆内存
2019/04/04 Javascript
js String.prototype.trim字符去前后空格的扩展
2020/08/23 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
python中cPickle用法例子分享
2014/01/03 Python
跟老齐学Python之变量和参数
2014/10/10 Python
python实现的简单FTP上传下载文件实例
2015/06/30 Python
VSCode下好用的Python插件及配置
2018/04/06 Python
在Python中构建增广矩阵的实现方法
2019/07/01 Python
css3的动画特效之动画序列(animation)
2017/12/22 HTML / CSS
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
美国新娘礼品店:The Paisley Box
2020/09/08 全球购物
ASICS印度官方网站:日本专业运动品牌
2020/06/20 全球购物
2014年教学工作总结
2014/11/13 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
使用springMVC所需要的pom配置
2021/09/15 Java/Android
java如何实现socket连接方法封装
2021/09/25 Java/Android
JavaScript阻止事件冒泡的方法
2021/12/06 Javascript