单例设计模式

知识点

1
2
# 让类创建的对象,在系统中只有一个唯一的实例
# 每执行一次"类名()"返回的对象,内存地址都是相同的

分配空间:__new__

1
2
3
4
5
6
# 实例化对象时,先调用__new__方法为对象分配空间,其是object的内置方法,作用包括以下:
# 1. 在内存中为对象分配空间
# 2. 返回对象的引用,然后将该引用作为第一个参数,传递给__init__方法
# 重写__new__方法的代码固定:
# 1. 重写new方法一定要:return super().__new__(cls),否则python得不到分配空间的对象引用,就不会调用对象的初始化方法
# 2. __new__是一个静态方法,调用时需主动传递"cls"参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 单例设计:用同一个类创建的对象,在系统中只有唯一的一个实例
# 配合类属性还可以使初始化动作只执行一次
class MusicPlayer(object):
# 定义一个空值,用于保存创建的对象
instance = None
# 用于判断是否执行初始化的值
init_itag = False

def __new__(cls, *arg, *kwarg):
if cls.instance is None:
cls.instance = super().__new__(cls) # 使用父类的__new__方法为第一个对象开辟空间
return cls.instance # 返回对象

def __init__(self):
if init_tag: # 如果已经初始化,则不再执行初始化的动作
return
print("执行初始化的动作")
init_itag = True

作业

  1. (问答)单例设计模式是指什么

  2. (问答)__new__方法的作用有哪些

  3. (问答)__new__方法使用时的注意点有哪些

  4. 根据如下需求,设计一个MusicPlayer:

    1
    2
    1. 单例设计模式,搭配类属性,通过类对象创建的实例在内存中只有一个实例
    2. 如果实例的同时已经初始化,则后续创建类时不再进行对象的初始化