1、单例模式

  确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类(比如win系统的回收站),单例模式是一种对象创建型模式

class Person(object):
    # 定义一个类属性,保存这个类创建的对象
    # instance 属性在类外不使用,可以私有
    __instance = None#None是一个空值,代表没有开辟空间
    # 定义一个属性判断是否第一次走init方法
    __is__first = True
    # 创建对象
    # 重写new方法,是为了完成单例模式中的对象地址唯一
    def __new__(cls, *args, **kwargs):
        # 判断是否通过这个类创建过对象
        if not cls.__instance:#如果not instance(即非None)
            # 创建对象保存起来
            cls.__instance = object.__new__(cls)#给instance赋值
        # 如果有值,直接返回
        return cls.__instance
    # 如果 not cls.__instance(非None),则把object.__new__(cls)的值赋给cls.__instance ,返回cls.__instance
    # 意思是如果有值,直接返回此值,代表创建第二个值开始,就一直返回的是第一个值,一直都是第一个值,所以无论怎么创建,还是只有一个值

    def __init__(self,name,age):
        # 判断是否第一次
        # 此处需要保证只赋值一次,第二次开始创建对象时不会重新赋值,一直用第一个值
        if Person.__is__first:
            self.name = name
            self.age = age
            # 设置类属性is__first为False
            Person.__is__first = False
# init方法的意思是:当第一次创建对象时,先给对象赋值,赋值过后把类属性is_first的值修改为False,
# 若第二次创建对象,代码走到这里时,不再符合if条件,无法第二次初始化属性,这就保证了这个类只有一个实例(只能创建一个对象,创建第二个开始都是无效的,打印出来的还是第一个的值)
# 创建对象
xiaoming = Person('小明',20)
xiaohonng = Person('小红',20)
xiaoyang = Person('小杨',21)
# 保证了对象的地址唯一
print(xiaoming.name,xiaohonng.name,xiaoyang.name)#打印结果:小明 小明 小明
print(xiaoming.age,xiaohonng.age,xiaoyang.age)#结果20 20 20

  单例模式只执行一次__new__和__init__方法,只能创建一个对象(创建多个对象实质还是第一个对象)