# ### 单态模式 '''无论实例化多少次,都有且只有一个对象.''' '''最终目的:为了节省内存空间.应用的场景是只调用相关的成员属性或方法,而不用动态添加成员属性方法的环境中''' """ __obj 变成私有,控制不让用户在类外直接获取obj,而是用__new__来控制返回的逻辑 先判断cls.__obj 是不是None 如果是None,代表是一个空的对象,那么就利用父类的__new__方法来创建对象 如果不是一个空对象,代表先前早已实例化过了一个对象 就把这个对象给他返回 """ # (1) 基本用法 class Singleton(): __obj = None def __new__(cls): if cls.__obj is None: # 借助父类创建对象 obj = object.__new__(cls) # 把这个对象赋值给类中成员属性__obj cls.__obj = obj return cls.__obj # 第一次创建时,因为cls.__obj 是None 所以创建一个对象 obj = Singleton() print(obj) # 第二次实例化时,因为cls.__obj 不是None ,直接返回上一次创建的那个对象 obj = Singleton() print(obj) # 第三次实例化时,同第二次 obj = Singleton() print(obj) obj = Singleton() print(obj) obj = Singleton() print(obj) # (2) 改造 class Singleton(): __obj = None def __new__(cls,*args,**kwargs): if cls.__obj is None: cls.__obj = object.__new__(cls) return cls.__obj def __init__(self,name): self.name = name obj1 = Singleton("王波") obj2 = Singleton("方真强") print(obj1.name) print(obj2.name) """ 第一次是创建对象,并且通过init初始化对象,为该对象赋值成员属性name self.name = 王波 第二次是直接返回上一个对象,然后对他进行初始化,为该对象赋值成员属性name self.name = 方真强 两个不同的变量名指向的是同一个对象 而此时该对象的成员属性name 这个值是方真强 print(obj1.name) print(obj2.name) 打印的都是方真强 """