一、单例模型简介
代码的设计模式共有25种,不同的应用场景应用不同的设计模式,从而达到简化代码、利于扩展、提高性能等目的。本文简述Python实现的单例模式场景。简而言之,单例模式的应用场景是一个类对象被实例化多次,在这样的场景下应用单例模式可以减少对象重复创建的消耗,从而节约内存。
二、__new__方法
使用 类目() 创建对象时,python的解释器首先会调用__new__方法为对象分配空间,同时,__new__方法是一个由object基类提供的内置的静态方法,其作用是返回对象的引用。综上,__new__方法的作用有两个:
- 在内存中为对象分配空间
- 返回对象的引用
python的解释器获得对象的引用后,会将引用作为第一个参数传递给 __init__ 方法。
三、重写__new__方法
单例模型的原理就是对__new__方法进行重写,而重写new方法的代码非常固定,唯一值得注意的是一定要 return super().__new__(cls),否则python解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法。
注意__new__是一个静态方法,在调用是需要主动传递cls参数。
class MusicPlayer: # 记录第一个被创建对象的引用 __instance = None # 重写__new__ 方法创建单例模型 # 说明:__new__方法是object基类提供的一种静态方法。 # 作用:1、为对象分配空间;2、返回对象引用 def __new__(cls, *args, **kwargs): # 1、判断类属性是否为空引用,若为空则为对象分配空间 if cls.__instance is None: print("这里还能执行其他只初始化一次的操作") cls.__instance = super().__new__(cls) # 返回对象引用 return cls.__instance def __init__(self, name): self.name = name print(f"{self.name}播放器初始化完成") # 创建多个对象 player1 = MusicPlayer("千千") player2 = MusicPlayer("万万") print(player1 is player2)
输出结果:
这里还能执行其他只初始化一次的操作
千千播放器初始化完成
万万播放器初始化完成
True