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__方法,只能创建一个对象(创建多个对象实质还是第一个对象)