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 相关文章推荐
对pycharm代码整体左移和右移缩进快捷键的介绍
Jul 16 Python
python爱心表白 每天都是浪漫七夕!
Aug 18 Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 Python
在Pycharm中设置默认自动换行的方法
Jan 16 Python
python-pyinstaller、打包后获取路径的实例
Jun 10 Python
Django模型修改及数据迁移实现解析
Aug 01 Python
python学生信息管理系统实现代码
Dec 17 Python
python 爬取小说并下载的示例
Dec 07 Python
python中numpy数组与list相互转换实例方法
Jan 29 Python
详解python网络进程
Jun 15 Python
基于Python编写简易版的天天跑酷游戏的示例代码
Mar 23 Python
Python docx库删除复制paragraph及行高设置图片插入示例
Jul 23 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&amp;java(一)
2006/10/09 PHP
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
php+iframe实现隐藏无刷新上传文件
2012/02/10 PHP
Yii查询生成器(Query Builder)用法实例教程
2014/09/04 PHP
DOM基础及php读取xml内容操作的方法
2015/01/23 PHP
教你识别简单的免查杀PHP后门
2015/09/13 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
2020/05/02 PHP
Extjs显示从数据库取出时间转换JSON后的出现问题
2012/11/20 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
2014/08/16 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
详解JavaScript中数组的相关知识
2015/07/29 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
2015/12/14 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
微信小程序实现签到弹窗动画
2020/09/21 Javascript
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
python实现识别相似图片小结
2016/02/22 Python
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
利用Python开发实现简单的记事本
2016/11/15 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
2018/10/11 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
幼儿园教育教学反思
2014/01/31 职场文书
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
党员“四风”问题批评与自我批评思想汇报
2014/10/06 职场文书
中秋客户感谢信
2015/01/22 职场文书
小学生六年级作文之关于感恩
2019/08/16 职场文书
python 模拟在天空中放风筝的示例代码
2021/04/21 Python
Oracle 区块链表创建过程详解
2021/05/15 Oracle
中国十大神话动漫电影排行榜 哪吒登顶 白蛇缘起排第七
2022/03/21 国漫
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL