01.单例设计模式
设计模式
单例设计模式
单例设计模式的应用场景
02.__new__方法
使用 类名() 创建对象时, Python的解释器 首先 会调用 __new__ 方法为对象 分配空间
__new__ 是一个由 object 基类提供的 内置的静态方法 , 主要作用有两个:
Python 的解释器获得对象的 引用 后,将引用作为 第一个参数, 传递给 __init__方法
//重写 __new__ 方法的 代码非常固定
03.Python中的单例
1 class MusicPlayer(object): 2 3 # 记录第一个被创建对象的引用 4 instance = None 5 def __new__(cls, *args, **kwargs): 6 7 # 1.判断类属性是否是空对象 8 if cls.instance is None: 9 # 2.调用父类的方法,为第一个对象分配空间 10 cls.instance = super().__new__(cls) 11 12 # 3.返回类属性保存的对象引用 13 return cls.instance 14 pass 15 16 17 # 创建多个对象 18 play1 = MusicPlayer() 19 print(play1) 20 21 play2 = MusicPlayer() 22 print(play2)
只执行一次初始化工作
在每次使用 类名() 创建对象时,Python 的解释器都会自动调用两个方法:
对__new__方法改造之后,每次都会得到 第一次被创建对象的引用
但是: 初始化方法还会被调用
需求:让 初始化动作 只被 执行一次
解决办法:
1 class MusicPlayer(object): 2 3 # 记录第一个被创建对象的引用 4 instance = None 5 # 记录是否执行过初始化方动作 6 init_flag = None 7 8 def __new__(cls, *args, **kwargs): 9 10 # 1.判断类属性是否是空对象 11 if cls.instance is None: 12 # 2.调用父类的方法,为第一个对象分配空间 13 cls.instance = super().__new__(cls) 14 15 # 3.返回类属性保存的对象引用 16 return cls.instance 17 18 def __init__(self): 19 # 1.判断是否执行过初始化动作 20 if MusicPlayer.init_flag: 21 return 22 23 # 2.如果没有执行过,在执行初始化动作 24 print("初始化播放器") 25 26 # 3. 修改类属性的标记 27 MusicPlayer.init_flag = True 28 pass 29 30 31 # 创建多个对象 32 play1 = MusicPlayer() 33 print(play1) 34 35 play2 = MusicPlayer() 36 print(play2)
原文:https://www.cnblogs.com/for-master/p/14608738.html