前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python3 实现单例设计模式

Python3 实现单例设计模式

作者头像
1_bit
发布2020-10-23 14:35:28
5100
发布2020-10-23 14:35:28
举报
文章被收录于专栏:我的知识小屋

单例模式的一般实现

饿汉式

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

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

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

代码语言:javascript
复制
class ClassObj(object):
    def __new__(cls):
        print("进行分配内存")
        return super().__new__(cls)

    def __init__(self):
        print("开始初始化")
cobj = ClassObj()

运行结果如下:

在这里插入图片描述
在这里插入图片描述

但是以上的代码并没有实现单例模式,这个时候,我们需要对以上代码进行更改。 在使用 new 方法时判断是否已经被实例化:

代码语言:javascript
复制
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()

以上代码在ClassObj中,定义了一个成员变量 instance,用来存储分配的空间引用,并且在__new__方法中最后return instance;假设第一次新建该类对象,instance为None则会进行实例化,假设不为None,则会提示已经分配了,不会再次分配空间,进行创建。运行结果如下:

在这里插入图片描述
在这里插入图片描述

以上结果只在第一次新建对象时分配了空间,之后创建对象并没有新建空间。 这时也可以直接输出类对象查看空间:

代码语言:javascript
复制
cobj = ClassObj()
cobj1 = ClassObj()
print(cobj)
print(cobj1)

结果如下是相同的:

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/06/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 单例模式的一般实现
  • 饿汉式
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档