# ### 单态模式
'''无论实例化多少次,都有且只有一个对象.'''
'''最终目的:为了节省内存空间.应用的场景是只调用相关的成员属性或方法,而不用动态添加成员属性方法的环境中'''
"""
__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)
打印的都是方真强
"""