专栏首页算法与编程之美Python基础 如何实现单例类

Python基础 如何实现单例类

欢迎点击「算法与编程之美」↑关注我们!

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

要知道什么是单例类,首先就得清楚什么是单例模式。单例模式,是一种简单的常用软件设计模式,在程序运行中有且只有一个实例。既应用该模式的一个类只能有一个对象实类,这种类称为单例类。网上的大多数解释都比较繁琐、复杂。这里小编通过自己理解尽量通俗、简单的向大家介绍单例类。

先写一个简单的类,来观察实例化对象是否只有一个。

class Test:
     pass
 
 a=Test()
 print(id(a)) # 1169738445096
 b=Test()
 print(id(b)) # 1169739284664

通过打印这两个实例的的内存地址,知道该类创建了两个实例,每次实例化一个对象都会在内存中重新分配一块空间,这样就会导致资源浪费,为了解决这个问题,要让一个类所实例对象都指向同一块内存空间,既单例类。

在Python中,类创建实例对象是通过父类object的_new_(cls)方法来实现的。我们可以通过重写这个方法来实现。

class Sinleton(object):
    _judge = None  # 定义一个类属性用于判断
    def __new__(cls):
        if cls._judge==None:
            #如果—_judge为空,则是第一次创建实例
            #那就通过父类的_new_(cls)创建
            cls._judge=object.__new__(cls)
            return  cls._judge
        else:
            #不是第一次创建,返回上一个对象的引用
            return cls._judge

obj1=Sinleton()
obj2=Sinleton()
print(id(obj1)) #2212148678952
print(id(obj2)) #2212148678952

除了重写_new_(cls)方法外,实现单例类的方法有很多,诸如文件导入、装饰器、_metaclass_元类等等。其中比较容易理解和运用的就是重写_new_(cls)方法以及文件导入形式。

将类在某个文件中实例化,并赋值给某个变量。通过该文件引用实例,观察打印的地址相同。

class Sinleton(object):
    pass
k=Sinleton()

from Singletons import k as obj1
print(id(obj1))

from Singletons import k as obj2
print(id(obj2))
#返回引用地址易相同

END

主 编 | 张祯悦

责 编 | 马原涛

where2go 团队


微信号:算法与编程之美

温馨提示:点击页面右下角“写留言”发表评论,期待您的参与!期待您的转发!

本文分享自微信公众号 - 算法与编程之美(algo_coding)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 部署项目到Tomcat的三种方法

    (1)bin目录:存放windows或Linux平台上启动和关闭Tomcat的脚本文件,可以直接开启关闭tomcat服务。还有一些jar包如tomcat-jul...

    浩Coding
  • Linux下配置JavaWeb环境

    最近需要一个Linux下的JavaWeb环境,所以写下这篇文章,好记性不如烂笔头嘛,O(∩_∩)O哈哈~。本篇教程用的是Centos7系统,需要安装JDK1.8...

    浩Coding
  • 第37节:多线程安全问题

    创建线程的方法 继承类Thread并重写run(),run()称为线程体;用这种方法定义的类不能再继承其他类。

    达达前端
  • 第33节:Java面向对象中的异常

    Exception:RuntimeException为空指针异常,数组下标越界异常,算数异常,类型转换异常等,IO异常(IOException),SQL异常(S...

    达达前端
  • 第30节:Java基础-内部类

    内部类可以直接访问外部类,但是外部类要访问内部类中的成员变量,就必须要创建内部类的对象。

    达达前端
  • 第34节:Java当中的异常

    了解Java当中的异常,那么什么是异常呢?异常又有什么分类呢?异常中的特殊结构:try...catch...finally 结构的使用方法。

    达达前端
  • 第31节:Java基础-类与对象

    Java基础-类与对象,方法的重载,构造方法的重载,static关键字,main()方法,this关键字,包,访问权限,类的继承,继承性,方法的重写,super...

    达达前端
  • 第32节:Java中-构造函数,静态方法,继承,封装,多态,包

    在现实世界当中,继承就是儿子得到老子的东西,在面向对象的世界当中,继承就是一个类得到了另一个类当中的成员变量和成员方法

    达达前端
  • 第36节:Java当中的线程

    Java当中的线程,进程和线程的关系?进程就是线程吗?不是的。线程的运行,和方法。

    达达前端
  • 第35节:Java面向对象中的多线程

    在Java面向对象中的多线程中,要理解多线程的知识点,首先要掌握什么是进程,什么是线程?为什么有多线程呢?多线程存在的意义有什么什么呢?线程的创建方式又有哪些?...

    达达前端

扫码关注云+社区

领取腾讯云代金券