P 面向对象 | 单例设计模式
2019-10-05 本文已影响0人
Ricsy

一、单例设计模式
名称 | 说明 |
---|---|
设计模式 | 是前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对某一特定问题的成熟解决方案 1. 使用设计模式,是为了可重用代码,让代码更容易被他人理解、保证代码可靠性 |
单例设计模式 | 目的是为了让类创建的对象,在系统中只有唯一的一个实例 每一次执行类名()返回的对象,内存地址是相同的 |
1.1 应用场景
- 音乐播放对象
只能播放一首歌 - 回收站对象
只有一个回收站 - 打印机对象
文件只能一个个打印
...
有唯一的一个存在
1.2 重写new方法
__new__
是由Python中object基类提供的内置的静态方法,调用时需要主动传递cls参数
__new__ |
主要作用 |
---|---|
1 | 在内存中为对象分配空间 |
2 | 返回对象的引用return super().__new__(cls)
|
Python解释器获得对象的引用后,将引用作为第一个参数,传递给__init__
方法
- 重写
__new__
方法
重写代码非常固定,必须有return super().__new__(cls)
,否则Python解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法
eg:

class MusicPlayer(object):
# 重写new方法(创建对象时会被自动调用)
def __new__(cls, *args, **kwargs):
# 创建对象,分配空间
instance = super().__new__(cls)
# 返回对象引用
return instance
def __init__(self):
print("播放器初始化")
mp3 = MusicPlayer()
print(mp3)
1.3 设计单例类
单例——让类创建的对象,在系统中只有唯一的一个实例

eg:
class MusicPlayer(object):
# 类属性,记录第一个对象的对象引用
instance = None
# 重写new方法(创建对象时会被自动调用)
def __new__(cls, *args, **kwargs):
# 判断类属性是否为空
if cls.instance is None:
# 调用父类方法,为第一个对象分配空间
cls.instance = super().__new__(cls)
# 返回类属性保存的对象引用
return cls.instance
def __init__(self):
print("播放器初始化")
mp3 = MusicPlayer()
mp4 = MusicPlayer()
print(mp3)
print(mp4)
1.3.1 只执行一次初始化工作
class MusicPlayer(object):
# 类属性,记录第一个对象的对象引用
instance = None
# 类属性,记录初始化执行状态,默认为Flase
init_flag = False
# 重写new方法(创建对象时会被自动调用)
def __new__(cls, *args, **kwargs):
# 判断类属性是否为空
if cls.instance is None:
# 调用父类方法,为第一个对象分配空间
cls.instance = super().__new__(cls)
# 返回类属性保存的对象引用
return cls.instance
def __init__(self):
# 判断是否初始化
if self.init_flag:
return
print("播放器初始化")
MusicPlayer.init_flag = True
mp3 = MusicPlayer()
mp4 = MusicPlayer()
print(mp3)
print(mp4)
更新中......