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  连接字符串(join %)
Sep 06 Python
详解Django中的权限和组以及消息
Jul 23 Python
详解在Python程序中解析并修改XML内容的方法
Nov 16 Python
Python中装饰器高级用法详解
Dec 25 Python
python+ffmpeg批量去视频开头的方法
Jan 09 Python
Python实现的爬取百度文库功能示例
Feb 16 Python
python实现输入任意一个大写字母生成金字塔的示例
Oct 27 Python
python实现身份证实名认证的方法实例
Nov 08 Python
Python编程快速上手——Excel表格创建乘法表案例分析
Feb 28 Python
详解Pycharm出现out of memory的终极解决方法
Mar 03 Python
基于python实现银行管理系统
Apr 20 Python
python flask开发的简单基金查询工具
Jun 02 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 base64编码后解码乱码的解决办法
2014/06/19 PHP
PHP微信支付实例解析
2016/07/22 PHP
PHP实现的曲线统计图表示例
2016/11/10 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
2017/02/04 PHP
php多文件打包下载的实例代码
2017/07/12 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
2013/07/09 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
JS折半插入排序算法实例
2015/12/02 Javascript
原生JS:Date对象全面解析
2016/09/06 Javascript
JavaScript日期对象(Date)基本用法示例
2017/01/18 Javascript
webpack4.x开发环境配置详解
2018/08/04 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
node将geojson转shp返回给前端的实现方法
2019/05/29 Javascript
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
Python二叉树定义与遍历方法实例分析
2018/05/25 Python
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
python 实现两个线程交替执行
2020/05/02 Python
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
好莱坞百老汇御用王牌美妆:Koh Gen Do 江原道
2018/04/03 全球购物
加拿大领先家居家具网上购物:Aosom.ca
2020/05/27 全球购物
计算机相关的自我评价
2014/01/15 职场文书
大学毕业感言一句话
2014/02/06 职场文书
货车司机岗位职责
2014/03/18 职场文书
倡议书范文
2014/04/16 职场文书
县政府班子个人对照检查材料
2014/10/05 职场文书
党员干部公开承诺书范文
2015/04/27 职场文书
建党伟业观后感
2015/06/01 职场文书
旷工检讨书大全
2015/08/15 职场文书
2016年社区“6.26”禁毒日宣传活动总结
2016/04/05 职场文书
导游词之南京汤山温泉
2019/11/26 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书
解决goland 导入项目后import里的包报红问题
2021/05/06 Golang
JavaScript流程控制(分支)
2021/12/06 Javascript
Python Matplotlib绘制两个Y轴图像
2022/04/13 Python
解决vue中provide inject的响应式监听
2022/04/19 Vue.js