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用pickle模块实现“增删改查”的简易功能
Jun 07 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
Nov 16 Python
使用python绘制3维正态分布图的方法
Dec 29 Python
Python实现将字符串的首字母变为大写,其余都变为小写的方法
Jun 11 Python
Django 开发环境与生产环境的区分详解
Jul 26 Python
python3.7 利用函数os pandas利用excel对文件名进行归类
Sep 29 Python
关于Tensorflow 模型持久化详解
Feb 12 Python
基于python实现模拟数据结构模型
Jun 12 Python
Python使用Selenium实现淘宝抢单的流程分析
Jun 23 Python
详解Python中的编码问题(encoding与decode、str与bytes)
Sep 30 Python
Flask-SocketIO服务端安装及使用代码示例
Nov 26 Python
python 爬取京东指定商品评论并进行情感分析
May 27 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中使用Oracle数据库(1)
2006/10/09 PHP
php中批量替换文件名的实现代码
2011/07/20 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
PHP解决URL中文GBK乱码问题的两种方法
2014/06/03 PHP
PHP实现的英文名字全拼随机排号脚本
2014/07/04 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
JavaScript脚本判断蜘蛛来源的方法
2015/09/22 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
JavaScript程序开发之JS代码放置的位置
2016/01/15 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
2016/10/09 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
JS原生轮播图的简单实现(推荐)
2017/07/22 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
Vue CLI3 开启gzip压缩文件的方式
2018/09/30 Javascript
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
2018/12/06 NodeJs
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
详解在Python和IPython中使用Docker
2015/04/28 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
Python发送http请求解析返回json的实例
2018/03/26 Python
python多线程下信号处理程序示例
2019/05/31 Python
python excel多行合并的方法
2020/12/09 Python
英国性感内衣和睡衣品牌:Bluebella
2018/01/26 全球购物
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
Prototype是怎么扩展DOM的
2014/10/01 面试题
市优秀教师事迹材料
2014/02/05 职场文书
文明礼仪演讲稿
2014/05/12 职场文书
财务负责人任命书
2014/06/06 职场文书
幼儿园社区活动总结
2014/07/07 职场文书
文明医院的标语集锦!
2019/07/24 职场文书
24句精辟的现实社会语录,句句扎心,道尽人性
2019/08/29 职场文书
Vue vee-validate插件的简单使用
2021/06/22 Vue.js