单例:
创建一个类对象时 , 系统会开辟一块专属于这个对象的空间 , 开辟的动作是由class中的 __new__方法自动完成的 。new方法完成创建空间后,会return空间信息给__init__方法, 由__init__方法进行初始化设置 。那么每创建一个类对象,都将自动开辟一个新空间 。
单例的作用, 就是让指定的类对象, 只在创建第一个类对象时开辟空间,后面的类对象 ,都沿用这个空间,不再做重新开辟空间的动作。
应用场景: 音乐播放器 , 登录框这些,同一时间只能单独存在的地方。
简单的代码:
class test(): # 创建类 # 先定义一个空值 , 用来做判断 space = None '''修改new方法 : 1、判断类属性space是不是为空 2、调用父类方法开辟新空间 3、return这个空间给init''' def __new__(cls, *args, **kwargs): if cls.space is None: cls.space = super().__new__(cls) return cls.space '''初始化方法随便搞一下''' def __init__(self): print(66) a = test() b=a c= test() print(id(a),id(b),id(c))
此时三个实例对象a,b,c的id位置一致,运行结果:
66 66 615122232600 615122232600 615122232600 Process finished with exit code 0
代码实现思路: 判断类属性space是不是为空,第一个实例对象创建时,space=None,此时调用父类方法创建一个空间 (因为父类的new方法本身就会创建空间,这里不需要考虑如何进行创建,只需调用就会自动创建),并return ,等到第二次有新的实例对象时,space已经不为空了,会直接return第一次创建好的空间,同理后面的实例对象都在同一个空间了。
当时研究明白之后,回头想实现的时候磕磕绊绊的,还是写下来吧~~~