Python3 实现单例设计模式

举报
1_bit 发表于 2021/05/26 15:39:35 2021/05/26
【摘要】 单例模式的一般实现 饿汉式 懒汉式就是通过一个方法才能实现单例,我不是很常用,所以在此就写个饿汉式。以后再补懒汉式。 单例模式的核心作用是保证一个类只有一个该类型的对象。在一个对象被过多调用时避免过多的消耗内存,即可使用单例模式。 在python中新建一个对象会调用 __new__ 方法为创建的对象分配其内存空间,并且返回该对象的引用,随后将会传给 __init_...

单例模式的一般实现

饿汉式

懒汉式就是通过一个方法才能实现单例,我不是很常用,所以在此就写个饿汉式。以后再补懒汉式。
单例模式的核心作用是保证一个类只有一个该类型的对象。在一个对象被过多调用时避免过多的消耗内存,即可使用单例模式。

在python中新建一个对象会调用 __new__ 方法为创建的对象分配其内存空间,并且返回该对象的引用,随后将会传给 __init__ 函数进行实例化。

一般情况下并不需要调用 new 方法,当使用单例时这一步是必要的。在重写 new 方法时需要返回当前实例的类 cls :return super().__new__(cls)。得到了分配的内存空间引用后,开始为对象进行实例化,代码可以简单的写为如下:

class ClassObj(object): def __new__(cls): print("进行分配内存") return super().__new__(cls) def __init__(self): print("开始初始化")
cobj = ClassObj()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

运行结果如下:
在这里插入图片描述
但是以上的代码并没有实现单例模式,这个时候,我们需要对以上代码进行更改。
在使用 new 方法时判断是否已经被实例化:

class ClassObj(object): instance=None def __new__(cls): if cls.instance is None: cls.instance=super().__new__(cls) print("进行分配内存") else: print("已经分配了") return cls.instance def __init__(self): print("已经分配了")
cobj = ClassObj()
cobj1 = ClassObj()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

以上代码在ClassObj中,定义了一个成员变量 instance,用来存储分配的空间引用,并且在__new__方法中最后return instance;假设第一次新建该类对象,instance为None则会进行实例化,假设不为None,则会提示已经分配了,不会再次分配空间,进行创建。运行结果如下:
在这里插入图片描述
以上结果只在第一次新建对象时分配了空间,之后创建对象并没有新建空间。
这时也可以直接输出类对象查看空间:

cobj = ClassObj()
cobj1 = ClassObj()
print(cobj)
print(cobj1)

  
 
  • 1
  • 2
  • 3
  • 4

结果如下是相同的:
在这里插入图片描述

文章来源: i1bit.blog.csdn.net,作者:A757291228,版权归原作者所有,如需转载,请联系作者。

原文链接:i1bit.blog.csdn.net/article/details/106932546

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。