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 相关文章推荐
phpsir 开发 一个检测百度关键字网站排名的python 程序
Sep 17 Python
在Python中使用swapCase()方法转换大小写的教程
May 20 Python
Python WXPY实现微信监控报警功能的代码
Oct 20 Python
Python实现两款计算器功能示例
Dec 19 Python
Python2实现的图片文本识别功能详解
Jul 11 Python
pygame游戏之旅 添加游戏介绍
Nov 20 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
Jan 14 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
Aug 13 Python
numpy np.newaxis 的实用分享
Nov 30 Python
使用Keras 实现查看model weights .h5 文件的内容
Jun 09 Python
python 基于卡方值分箱算法的实现示例
Jul 17 Python
Python实战之疫苗研发情况可视化
May 18 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
虫族 ZERG 概述
2020/03/14 星际争霸
PHP has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
2013/06/28 PHP
PHP实现即时输出、实时输出内容方法
2015/05/27 PHP
Yii中创建自己的Widget实例
2016/01/05 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
PHP观察者模式定义与用法实例分析
2019/03/22 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
js中prototype用法详细介绍
2013/11/14 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
javascript为按钮注册回车事件(设置默认按钮)的方法
2015/05/09 Javascript
跟我学习javascript的for循环和for...in循环
2015/11/18 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
javascript制作照片墙及制作过程中出现的问题
2016/04/04 Javascript
去除html代码里面的script正则方法
2016/05/19 Javascript
浅谈js中的in-for循环
2016/06/28 Javascript
js实现单张图片平移切换效果
2017/10/11 Javascript
详解webpack的clean-webpack-plugin插件报错
2020/10/16 Javascript
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
python数据清洗系列之字符串处理详解
2017/02/12 Python
详解Python 模拟实现生产者消费者模式的实例
2017/08/10 Python
python 文件操作删除某行的实例
2017/09/04 Python
python如何通过实例方法名字调用方法
2018/03/21 Python
解决pandas使用read_csv()读取文件遇到的问题
2018/06/15 Python
Python函数和模块的使用总结
2019/05/20 Python
浅析rem和em和px vh vw和% 移动端长度单位
2016/04/28 HTML / CSS
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
早餐连锁店计划书
2014/01/08 职场文书
经典广告词大全
2014/03/14 职场文书
工作分析计划书
2014/04/30 职场文书
春秋淹城导游词
2015/02/11 职场文书
中英文求职信范文
2015/03/19 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
用CSS3画一个爱心
2021/04/27 HTML / CSS
以下牛机,你有几个
2022/04/05 无线电