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下简易的单例模式详解相关推荐

  1. 用python写一个简单的爬虫_Python实现简易Web爬虫详解

    编辑推荐: 本文主要介绍了Python实现简易Web爬虫详解,希望对大家有帮助. 本文来自于脚本之家 ,由火龙果软件Alice编辑,推荐. 简介: 网络爬虫(又被称为网页蜘蛛),网络机器人,是一种按照 ...

  2. python flask安装_python flask安装和命令详解

    Flask Web开发实战学习笔记 Flask简介 Flask是使用Python编写的Web微框架.Web框架可以让我们不用关 心底层的请求响应处理,更方便高效地编写Web程序.因为Flask核心简 ...

  3. python text函数_python可视化text()函数使用详解

    python可视化text()函数使用详解 这篇文章主要介绍了python可视化text()函数使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考 ...

  4. python清空集合_python集合删除多种方法详解

    这篇文章主要介绍了python集合删除多种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 删除指定的元素 A={'a','c','b','d ...

  5. python getsize函数_Python getsizeof()和getsize()区分详解

    sys.getsizeof() 获取程序中声明的一个整数,存储在变量中的大小,以字节(byte)为单位 import sys print(sys.getsizeof('')) print(sys.ge ...

  6. office是python打开方式_Python读取word文本操作详解

    本文研究的主要问题时Python读取word文本操作,分享了相关概念和实现代码,具体如下. 一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就 ...

  7. python中堆排序_Python实现堆排序的方法详解

    本文实例讲述了Python实现堆排序的方法.分享给大家供大家参考,具体如下: 堆排序作是基本排序方法的一种,类似于合并排序而不像插入排序,它的运行时间为O(nlogn),像插入排序而不像合并排序,它是 ...

  8. 怎么用python统计字数_Python统计字数的思路详解

    这篇文章主要介绍了Python 统计字数的思路详解,文中还给大家提供了不借助第三方模块的解决方法,感兴趣的朋友一起看看吧 问题描述: 用 Python 实现函数 count_words(),该函数输入 ...

  9. python 制作抽奖_python制作抽奖程序代码详解

    实现制作抽奖程序,需要认知到我们可以看到一般抽奖程序界面上是有很多按钮的,比如中奖区域,按键开始区域等等,所以我们先要设置界面,然后把这些按钮添加到界面中去,想必这对于学过tkinter的同学应该不难 ...

最新文章

  1. Emacs 矩形编辑
  2. Python 索引for循环
  3. [转]《RabbitMQ官方指南》安装指南
  4. .Net Core中的日志组件(Logging)
  5. [LeetCode] Search in Rotated Sorted Array
  6. C++矩阵库 Eigen 快速入门
  7. 携程将推“3+2”工作模式:每周到岗3天,在家2天,你羡慕吗?
  8. GBDT算法之流失预警模型
  9. 餐饮为什么很难做到薄利多销?
  10. Android WebView使用基础
  11. c语言 10^30,^ 在C语言中是什么意思?
  12. ‘utf-8‘ codec can‘t decode byte 0xc8 in position 0: invalid continuation byte
  13. Android 换行符号(\n)放到Android当中的TextView显示双斜杠(\\n)
  14. mq消息落地及业务处理踩坑记录
  15. 9本R语言书,从入门到进阶都在这了
  16. autolayout教程Android,AndroidAutoLayout的简单阅读
  17. AVC与HEVC的差异-帧内预测
  18. 使用记事本完成第一个Java程序的开发遇到异常
  19. 手机删掉的照片怎么恢复
  20. 流形上的微积分和微分形式的可视化导论(一)

热门文章

  1. react native命令行全局安装
  2. 环状进度条progress bar circle
  3. AWS实例上AMI和用户名的映射表
  4. Log and display Log text type in Account Overview page
  5. ABAP webdynpro Dynamically add file upload
  6. Application log handling when maintaining product sales area data COM_PRWB_SET_LOGSETTYPE
  7. @Resource注解研究和在SAP Hybris ECP中的应用
  8. python练手_Python数据分析练手项目
  9. AC自动机build时的一点小优化
  10. java 按键消息监听器用法,Java命令行中的键监听器