• 单例模式


    转自http://www.nnzhp.cn/archives/716

    那什么是单例模式呢,它有什么具体的作用呢?

    单例模式说直白一点就是只有一个实例,不管实例化多少次就只有一个实例。

    举个例子来说,我们打开qq音乐,不管你打开几次,都只会有那一个qq音乐,打开多了放了好几首歌没法听了;再比如说回收站,你打开再多次只会打开一个。这就是用的是单例设计模式。

    那在python里面怎么怎么实现单例模式呢,单例模式就是只有一个实例,那肯定是指类在实例化的时候,只会实例化一个,就需要用到类里面的一个内置函数__new__,类就是通过这个函数来进行实例化操作的。它在__init__之前先执行

    那我们知道类是通过__new__函数来进行实例化的,那就好办了,思路就是先判断一下这个类有没有被实例化过,如果实例化过了,那我们就不要调用继续实例化了,返回原来的那个实例,如果没有被实例化才继续实例化。

    先写一个普通的类,看一下实例化之后的内存地址,可以看到,正常的一个类,实例化两次,内存地址是不一样的,不是一个对象

    ps:重写__new__这个方法,如果想实例化必须调用一个父类的__new__(cls)方法,要不然不能实例化,单例模式的写法也很单一,死记硬背就可以了,代码如下:

     1 class MySQL(object):
     2     __instance  = None  #定义一个变量存实例
     3  
     4     def __new__(cls, *args, **kwargs):#重写__new__方法
     5         if cls.__instance:      #判断如果这个实例的值不为空
     6             return cls.__instance #就返回这个实例
     7         cls.__instance = super().__new__(cls)  #走到下面说明是第一次实例化,就调用父类的__new__函数实例化这个类,存到__instance变量里
     8         return cls.__instance #然后返回这个实例
     9  
    10 m = MySQL()
    11 print('第一次实例化m',m)
    12 k = MySQL()
    13 print('第二次实例化k',k)
  • 相关阅读:
    Spring的IOC原理(转载)
    谈谈对Spring IOC的理解
    Servlet3.0学习总结(四)——使用注解标注监听器(Listener)
    Servlet3.0学习总结(三)——基于Servlet3.0的文件上传
    Servlet3.0学习总结(二)——使用注解标注过滤器(Filter)
    Servlet3.0学习总结(一)——使用注解标注Servlet
    XML学习总结(二)——XML入门
    XML学习总结(一)——XML介绍
    孤傲苍狼的博客园
    android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明
  • 原文地址:https://www.cnblogs.com/jiadan/p/12012914.html
Copyright © 2020-2023  润新知