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