1. 单例设计模式
单例设计模式使类创建的对象,在系统中只有一个唯一的实例。例如音乐播放器 对象、回收站对象、打印机对象等,都是单例设计模式的应用。
单例设计模式下,每一次执行 类名() 返回的对象,内存地址是相同的。
2. python的单例设计模式
python中设计单例模式,可以使用类属性,定义一个类属性,在__new__方法中判断该类属性是否为空,如果为空,调用 super().__new__(cls) 创建对象;如果不为空,直接返回该类属性。
以音乐播放器类MusicPlayer为例,设计单例模式如下:
class MusicPlayer(object):
# 定义类属性,创建的实例对象
instance = None
def __new__(cls,*args,**kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
def __init__(self):
print("初始化音乐播放器")
if __name__ == '__main__':
player = MusicPlayer()
player1 = MusicPlayer()
print(player)
print(player1)
显示结果,创建的两个对象的内存地址是一样的,说明只创建了一个唯一的对象。
初始化音乐播放器
初始化音乐播放器
<__main__.MusicPlayer object at 0x000001D5A65C4220>
<__main__.MusicPlayer object at 0x000001D5A65C4220>
3. 优化python单例设计模式
如上代码还有点问题:每次使用类名()的方式创建对象时,都会调用__init__()方法,这导致显示的信息有两次 ‘初始化音乐播放器’,让人产生误解。
可以在MusicPlayer类中增加一个类属性,通过判断该类属性,决定是否要打印初始化信息,如下:
class MusicPlayer(object):
instance = None
show_flag = True
def __new__(cls,*args,**kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
def __init__(self):
if MusicPlayer.show_flag:
print("初始化音乐播放器")
MusicPlayer.show_flag = False
if __name__ == '__main__':
player = MusicPlayer()
player1 = MusicPlayer()
print(player)
print(player1)
显示结果:
初始化音乐播放器
<__main__.MusicPlayer object at 0x0000019F7C7F4220>
<__main__.MusicPlayer object at 0x0000019F7C7F4220>
可以看到只打印了一次初始化信息。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/46088.html