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 相关文章推荐
在 Django/Flask 开发服务器上使用 HTTPS
Jul 03 Python
使用graphics.py实现2048小游戏
Mar 10 Python
Python实现压缩和解压缩ZIP文件的方法分析
Sep 28 Python
图解Python变量与赋值
Apr 03 Python
django rest framework 数据的查找、过滤、排序的示例
Jun 25 Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 Python
python 常见字符串与函数的用法详解
Nov 23 Python
python导包的几种方法(自定义包的生成以及导入详解)
Jul 15 Python
Python imread、newaxis用法详解
Nov 04 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
Jan 04 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
Jul 14 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中如何将数组变量写入文件
2013/06/06 PHP
一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能
2009/09/09 Javascript
Javascript alert消息换行的方法
2013/08/07 Javascript
javascript实现确定和取消提示框效果
2015/07/10 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
Move.js入门
2017/02/08 Javascript
js实现多行文本框统计剩余字数功能
2017/03/28 Javascript
React组件生命周期详解
2017/07/03 Javascript
JavaScript之Canvas_动力节点Java学院整理
2017/07/04 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
Python复制文件操作实例详解
2015/11/10 Python
使用Python脚本和ADB命令实现卸载App
2017/02/10 Python
Python插件virtualenv搭建虚拟环境
2017/11/20 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
python批量修改文件夹及其子文件夹下的文件内容
2019/03/15 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
2019/07/10 Python
利用pyecharts实现地图可视化的例子
2019/08/12 Python
Python中断多重循环的思路总结
2019/10/04 Python
python numpy数组复制使用实例解析
2020/01/10 Python
推荐技术人员一款Python开源库(造数据神器)
2020/07/08 Python
意大利网上药房:Farmacia 33
2020/01/27 全球购物
Swanson中国官网:美国斯旺森健康产品公司
2021/03/01 全球购物
2014政务公开实施方案
2014/02/19 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
二年级班级文化建设方案
2014/05/10 职场文书
安全生产宣传标语
2014/06/06 职场文书
2016新党章学习心得体会
2016/01/15 职场文书
小学三年级语文教学反思
2016/03/03 职场文书
vue使用localStorage持久性存储实现评论列表
2022/04/14 Vue.js