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实现字典依据value排序
Feb 24 Python
Python设计模式之MVC模式简单示例
Jan 10 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
Mar 19 Python
Python 实现异步调用函数的示例讲解
Oct 14 Python
python同步windows和linux文件
Aug 29 Python
Django学习之文件上传与下载
Oct 06 Python
TensorFlow 多元函数的极值实例
Feb 10 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
Apr 17 Python
Python基于DB-API操作MySQL数据库过程解析
Apr 23 Python
python中Django文件上传方法详解
Aug 05 Python
如何基于matlab相机标定导出xml文件
Nov 02 Python
python三子棋游戏
May 04 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防CC攻击实现代码
2011/12/29 PHP
10个实用的PHP正则表达式汇总
2014/10/23 PHP
php提示Failed to write session data错误的解决方法
2014/12/17 PHP
php use和include区别总结
2019/10/13 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
javascript实现面向对象类的功能书写技巧
2010/03/07 Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
2012/01/15 Javascript
jQuery 开发者应该注意的9个错误
2012/05/03 Javascript
javascript中setTimeout的问题解决方法
2014/05/08 Javascript
js propertychange和oninput事件
2014/09/28 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
2014/12/29 Javascript
浅谈jQuery中setInterval()方法
2015/07/07 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
Vue中引入样式文件的方法
2017/08/18 Javascript
详解使用nvm管理多版本node的方法
2017/08/30 Javascript
详解webpack多页面配置记录
2018/01/22 Javascript
vue.js 中使用(...)运算符报错的解决方法
2018/08/09 Javascript
node版本管理工具n包使用教程详解
2018/11/09 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
2019/05/22 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
[07:59]2014DOTA2叨叨刀塔 林熊猫称被邀请赛现场盛况震撼
2014/07/21 DOTA
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
Python OpenCV处理图像之图像像素点操作
2018/07/10 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
Python爬取梨视频的示例
2021/01/29 Python
CSS3 background-image颜色渐变的实现代码
2018/09/13 HTML / CSS
使用before和:after伪类制作css3圆形按钮
2014/04/08 HTML / CSS
详解h5页面在不同ios设备上的问题总结
2019/03/01 HTML / CSS
美国珠宝店:Helzberg Diamonds
2018/10/24 全球购物
英国行业制服供应商:Alexandra
2019/09/14 全球购物
房屋买卖协议书
2014/04/10 职场文书
2014年行政工作总结
2014/11/19 职场文书
汽车修理厂管理制度
2015/08/05 职场文书
JavaScript实例 ODO List分析
2022/01/22 Javascript
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js