日期:2020年2月15日
作者:Commas
注释:学习就是为了忘记,接上一章《Python3之面向对象小结》,现在讲一下单例;
如果您想了解更多有关Python的知识,那么请点《我的Python浅谈系列目录》
文章目录
一、聊一聊单例是什么
单例
,从字面上理解,一个唯一的实例。在某些情况,我们或许不需要更多的实例,比如视频播放器,那么就需要使用单例设计模式
来只允许获得唯一的一个实例对象。
那么如何实现呢?实际上很简单,就是无论多少次类实例化对象的时候,都只返回一个相同的内存地址,保证实例对象的内存地址是相同的,从而保证只有一个实例对象,实现的大致思路如下:
- 首次实例对象,使用Object基类中的__new__()内置静态方法,为对象分配内存地址,以后都不再为实例重新分配内存空间;
- 实例对象属性只需要初始化一次,所以在内置方法__init__()中做相应的判断;
二、举一举单例的示例
class MoviePlayer:
"""Python3类都会自动继承Obiect类"""
# 定义类属性记录单例对象引用
# 若不为None,则已经创建了一个实例,
# 将不再为对象重新申请分配内存空间,实现单例(唯一的一个实例)
instance = None
# 用来记录实例初始化情况
is_init = False
def __new__(cls, *args, **kwargs):
"""
【object内置静态方法】:调用时,需要主动传递cls参数
1、为对象分配内存空间
2、返回对象引用
"""
print("调用__new__方法")
if cls.instance is None:
cls.instance = super().__new__(cls)
print(cls.instance)
return cls.instance
def __init__(self):
"""
1、实例对象初始化
2、定义实例属性
"""
# 因为单例,所以实例对象只需要被初始化一次
# 我们只要判断是否有实例是否已创建
if MoviePlayer.is_init:
return
# 标记已经初始化
MoviePlayer.is_init = True
print("调用__init__方法,进行对象实例初始化")
player = MoviePlayer()
print(player)
print("="*20)
player1 = MoviePlayer()
print(player1)
控制台输出:
调用__new__方法
<__main__.MoviePlayer object at 0x0000023C59041518>
调用__init__方法,进行对象实例初始化
<__main__.MoviePlayer object at 0x0000023C59041518>
====================
调用__new__方法
<__main__.MoviePlayer object at 0x0000023C59041518>
<__main__.MoviePlayer object at 0x0000023C59041518>
版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/104328551