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实现在线程里运行scrapy的方法
Apr 07 Python
在Python的Django框架中创建语言文件
Jul 27 Python
Python实现Mysql数据库连接池实例详解
Apr 11 Python
动态规划之矩阵连乘问题Python实现方法
Nov 27 Python
Python实现的朴素贝叶斯分类器示例
Jan 06 Python
Python实现字符串的逆序 C++字符串逆序算法
May 28 Python
Python中文件的读取和写入操作
Apr 27 Python
python2与python3中关于对NaN类型数据的判断和转换方法
Oct 30 Python
浅谈Python编程中3个常用的数据结构和算法
Apr 30 Python
python导入pandas具体步骤方法
Jun 23 Python
Pycharm生成可执行文件.exe的实现方法
Jun 02 Python
Python list和str互转的实现示例
Nov 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
Pain 全世界最小最简单的PHP模板引擎 (普通版)
2011/10/23 PHP
php使用百度天气接口示例
2014/04/22 PHP
变量在 PHP7 内部的实现(二)
2015/12/21 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
PHP实现新型冠状病毒疫情实时图的实例
2020/02/04 PHP
event.srcElement+表格应用
2006/08/29 Javascript
基于jquery的仿百度搜索框效果代码
2011/04/11 Javascript
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
js限制文本框只能输入数字方法小结
2014/06/16 Javascript
简介JavaScript中search()方法的使用
2015/06/06 Javascript
jquery 中ajax执行的优先级
2015/06/22 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
2015/08/06 Javascript
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
vue.js利用defineProperty实现数据的双向绑定
2017/04/28 Javascript
JQuery 获取Dom元素的实例讲解
2017/07/08 jQuery
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
浅谈express.js框架中间件(middleware)
2019/04/07 Javascript
vue实现分页加载效果
2019/12/24 Javascript
[05:05]第三天的dota2
2013/07/29 DOTA
[46:44]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第二场 3月7日
2021/03/11 DOTA
python字符串连接的N种方式总结
2014/09/17 Python
python使用urlparse分析网址中域名的方法
2015/04/15 Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
2018/01/23 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
css3使网页、图片变成灰色兼容大多数浏览器
2014/07/02 HTML / CSS
白宫黑市官网:White House Black Market
2016/11/17 全球购物
Melijoe美国官网:法国奢侈童装购物网站
2017/04/19 全球购物
在Java开发中如何选择使用哪种集合类
2016/08/09 面试题
C语言笔试题
2014/09/04 面试题
新学期开学寄语
2014/01/18 职场文书
2015年小学教导处工作总结
2015/05/26 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
《曾国藩家书》读后感——读家书,立家风
2019/08/21 职场文书
MySQL 原理与优化之Update 优化
2022/08/14 MySQL