17 - 单例模式
一.单列模式
- 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类
-
当造对象不需要传参时,即用来初始化的
__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对象。 -
当需要给造的对象传参时,即
__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方法中的代码了。

浙公网安备 33010602011771号