17 - 单例模式

一.单列模式

  • 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类
  1. 当造对象不需要传参时,即用来初始化的__init__方法没有参数:

    class Singleton(object):
    	#私有化   
    	__instance = None
    	
        #重写__new__
        def __new__(cls):  #无参,因为__init__无参
            if not cls.__instance:
                cls.__instance = object.__new__(cls)
            return cls.__instance
    
    s = Singleton()
    s1 = Singleton()
    
    print(s,s1) #地址相同
    

    说明:执行s = Singleton时,先去找所属类中的__new__执行,判断是否还没有分配地址空间。没有的话,则执行代码object.__new__(cls),通过object中的new方法开辟一个将来给对象赋值的地址,然后将地址赋给cls.__instance并返回,再去执行__init__方法,此类中没有,则去执行父类object中的__inint__方法,由于object中的init方法没有多余的操作,执行完后,将地址值赋给对象s变量。

    当再去创建此类的对象时,判断Singleton中的私有属性不为空,说明有地址,则将此类的私有变量__instance值(分配的地址)返回,再执行此类中__init__方法,但是没有定义,所以去找此类的父类object中的__init__方法,而object中的init方法中没有多余的操作,所以会直接将地址值赋给s1对象。

  2. 当需要给造的对象传参时,即__init__方法有参数,需要对对象的属性进行初始化

    class Singleton(object):
        __instance = None
        __is_first = True
    
        def __new__(cls, age, name):  #为什么这里没有用到的age,name还需要定义,这里的参数是干什么用的
            if not cls.__instance:
                cls.__instance = object.__new__(cls)
            return cls.__instance
    
        def __init__(self, age, name):
            if self. __is_first: # 不会再创建第二个对象
                self.age = age
                self.name = name
                Singleton. __is_first = False
    
    
    a = Singleton(18, "张三")
    b = Singleton(28, "张三")
    
    print(id(a))
    print(id(b))
    
    print(a.age) # 18
    print(b.age) # 18
    
    a.age = 19
    print(b.age) # 19
    

说明:这里类中重写了__init()方法,所以执行完new后会去执行此类中的init方法,进行一些对象的初始化,对象已经有一个的话就不再执行init方法中的代码了。

posted @ 2021-10-14 19:22  深藏Bluee  阅读(59)  评论(0)    收藏  举报