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的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
Dec 14 Python
python中文乱码不着急,先看懂字节和字符
Dec 20 Python
Python实现在某个数组中查找一个值的算法示例
Jun 27 Python
Django csrf 两种方法设置form的实例
Feb 03 Python
python输入多行字符串的方法总结
Jul 02 Python
详解python环境安装selenium和手动下载安装selenium的方法
Mar 17 Python
Python实现一个简单的毕业生信息管理系统的示例代码
Jun 08 Python
将pycharm配置为matlab或者spyder的用法说明
Jun 08 Python
解析Python 偏函数用法全方位实现
Jun 26 Python
用Python制作灯光秀短视频的思路详解
Apr 13 Python
Python使用scapy模块发包收包
May 07 Python
python turtle绘图
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递归获取目录内文件(包含子目录)封装类分享
2013/12/25 PHP
php自动给网址加上链接的方法
2015/06/02 PHP
隐性调用php程序的方法
2015/06/13 PHP
PHP和MYSQL实现分页导航思路详解
2017/04/11 PHP
splice slice区别
2006/10/09 Javascript
jquery下div 的resize事件示例代码
2014/03/09 Javascript
JS获取url参数、主域名的方法实例分析
2016/08/03 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
2016/08/15 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
jQuery和JavaScript节点插入元素的方法对比
2016/11/18 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
Vue 进阶之路(三)
2019/04/18 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
微信小程序网络请求实现过程解析
2019/11/06 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
[01:12:53]完美世界DOTA2联赛PWL S2 Forest vs SZ 第一场 11.25
2020/11/26 DOTA
python基础教程之udp端口扫描
2014/02/10 Python
python采用getopt解析命令行输入参数实例
2014/09/30 Python
Python利用正则表达式匹配并截取指定子串及去重的方法
2015/07/30 Python
基于Python 的进程管理工具supervisor使用指南
2016/09/18 Python
详解python使用Nginx和uWSGI来运行Python应用
2018/01/09 Python
Python装饰器用法实例总结
2018/02/07 Python
python正则-re的用法详解
2019/07/28 Python
详解Python 中sys.stdin.readline()的用法
2019/09/12 Python
python 画函数曲线示例
2019/12/04 Python
Python正则表达式学习小例子
2020/03/03 Python
CSS3 网页下拉菜单代码解释 中文翻译
2010/02/27 HTML / CSS
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
HTML5 FileReader对象的具体使用方法
2020/05/22 HTML / CSS
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
会计职业生涯规划书
2014/01/13 职场文书
小学毕业感言300字
2014/02/19 职场文书
食堂卫生管理制度
2015/08/04 职场文书
公司财务制度:成本管理控制制度模板
2019/11/19 职场文书