python单例模式解析_Python下简易的单例模式详解
Python 下的单例模式
要点:
1.某个类只能有一个实例;
2.它必须自行创建这个实例;
3.它必须自行向整个系统提供这个实例
方法:重写new函数
应该考虑的情况:
1.这个单例的类可能继承了别的类
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下简易的单例模式详解相关推荐
- 用python写一个简单的爬虫_Python实现简易Web爬虫详解
编辑推荐: 本文主要介绍了Python实现简易Web爬虫详解,希望对大家有帮助. 本文来自于脚本之家 ,由火龙果软件Alice编辑,推荐. 简介: 网络爬虫(又被称为网页蜘蛛),网络机器人,是一种按照 ...
- python flask安装_python flask安装和命令详解
Flask Web开发实战学习笔记 Flask简介 Flask是使用Python编写的Web微框架.Web框架可以让我们不用关 心底层的请求响应处理,更方便高效地编写Web程序.因为Flask核心简 ...
- python text函数_python可视化text()函数使用详解
python可视化text()函数使用详解 这篇文章主要介绍了python可视化text()函数使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考 ...
- python清空集合_python集合删除多种方法详解
这篇文章主要介绍了python集合删除多种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 删除指定的元素 A={'a','c','b','d ...
- python getsize函数_Python getsizeof()和getsize()区分详解
sys.getsizeof() 获取程序中声明的一个整数,存储在变量中的大小,以字节(byte)为单位 import sys print(sys.getsizeof('')) print(sys.ge ...
- office是python打开方式_Python读取word文本操作详解
本文研究的主要问题时Python读取word文本操作,分享了相关概念和实现代码,具体如下. 一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就 ...
- python中堆排序_Python实现堆排序的方法详解
本文实例讲述了Python实现堆排序的方法.分享给大家供大家参考,具体如下: 堆排序作是基本排序方法的一种,类似于合并排序而不像插入排序,它的运行时间为O(nlogn),像插入排序而不像合并排序,它是 ...
- 怎么用python统计字数_Python统计字数的思路详解
这篇文章主要介绍了Python 统计字数的思路详解,文中还给大家提供了不借助第三方模块的解决方法,感兴趣的朋友一起看看吧 问题描述: 用 Python 实现函数 count_words(),该函数输入 ...
- python 制作抽奖_python制作抽奖程序代码详解
实现制作抽奖程序,需要认知到我们可以看到一般抽奖程序界面上是有很多按钮的,比如中奖区域,按键开始区域等等,所以我们先要设置界面,然后把这些按钮添加到界面中去,想必这对于学过tkinter的同学应该不难 ...
最新文章
- Emacs 矩形编辑
- Python 索引for循环
- [转]《RabbitMQ官方指南》安装指南
- .Net Core中的日志组件(Logging)
- [LeetCode] Search in Rotated Sorted Array
- C++矩阵库 Eigen 快速入门
- 携程将推“3+2”工作模式:每周到岗3天,在家2天,你羡慕吗?
- GBDT算法之流失预警模型
- 餐饮为什么很难做到薄利多销?
- Android WebView使用基础
- c语言 10^30,^ 在C语言中是什么意思?
- ‘utf-8‘ codec can‘t decode byte 0xc8 in position 0: invalid continuation byte
- Android 换行符号(\n)放到Android当中的TextView显示双斜杠(\\n)
- mq消息落地及业务处理踩坑记录
- 9本R语言书,从入门到进阶都在这了
- autolayout教程Android,AndroidAutoLayout的简单阅读
- AVC与HEVC的差异-帧内预测
- 使用记事本完成第一个Java程序的开发遇到异常
- 手机删掉的照片怎么恢复
- 流形上的微积分和微分形式的可视化导论(一)
热门文章
- react native命令行全局安装
- 环状进度条progress bar circle
- AWS实例上AMI和用户名的映射表
- Log and display Log text type in Account Overview page
- ABAP webdynpro Dynamically add file upload
- Application log handling when maintaining product sales area data COM_PRWB_SET_LOGSETTYPE
- @Resource注解研究和在SAP Hybris ECP中的应用
- python练手_Python数据分析练手项目
- AC自动机build时的一点小优化
- java 按键消息监听器用法,Java命令行中的键监听器