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实现超简单端口转发的方法
Mar 13 Python
总结Python编程中三条常用的技巧
May 11 Python
python实现八大排序算法(2)
Sep 14 Python
python中获得当前目录和上级目录的实现方法
Oct 12 Python
Python实现简单求解给定整数的质因数算法示例
Mar 25 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
Dec 05 Python
基于django ManyToMany 使用的注意事项详解
Aug 09 Python
基于Python2、Python3中reload()的不同用法介绍
Aug 12 Python
python与js主要区别点总结
Sep 13 Python
Python中openpyxl实现vlookup函数的实例
Oct 28 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
Nov 13 Python
python math模块的基本使用教程
Jan 16 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 用数组降低程序的时间复杂度
2009/12/04 PHP
PHP写杨辉三角实例代码
2011/07/17 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
js ondocumentready onmouseover onclick onmouseout 样式
2010/07/22 Javascript
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
2013/02/05 Javascript
解决JS中乘法的浮点错误的方法
2014/01/03 Javascript
Javascript的严格模式strict mode详细介绍
2014/06/06 Javascript
json实现前后台的相互传值详解
2015/01/05 Javascript
js匿名函数作为函数参数详解
2016/06/01 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
原生JS写Ajax的请求函数功能
2017/12/22 Javascript
JS实现倒计时图文效果
2018/11/17 Javascript
JavaScript对JSON数组简单排序操作示例
2019/01/31 Javascript
深入探讨JavaScript的最基本部分之执行上下文
2019/02/12 Javascript
[58:54]EG vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
python求绝对值的三种方法小结
2019/12/04 Python
使用python 计算百分位数实现数据分箱代码
2020/03/03 Python
Python实现UDP程序通信过程图解
2020/05/15 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
盛大二次面试题
2016/11/18 面试题
记者岗位职责
2014/01/06 职场文书
业绩倒数第一的检讨书
2014/09/24 职场文书
九九重阳节标语
2014/10/07 职场文书
2014年财务经理工作总结
2014/12/08 职场文书
人口与计划生育责任书
2015/05/09 职场文书
在职证明书模板
2015/06/15 职场文书
解决pytorch读取自制数据集出现过的问题
2021/05/31 Python
OpenCV-Python实现油画效果的实例
2021/06/08 Python
Java循环队列与非循环队列的区别总结
2021/06/22 Java/Android
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL