Python(7)

单例设计模式

设计模式

设计模式是前人工作的总结和提炼,通常,广泛流传的设计模式都是针对某一特定问题的成熟解决方案

单例设计模式

  • 目的:让类创建对象,在系统中只有唯一个实例对象
  • 每一侧执行类名()返回的对象、内存地址都是相同的

单例设计模式的应用场景

  • 音乐播放对象(同一时间只能播放一首歌曲)
  • 回收站对象(在一个操作系统中只有一个回收站)
  • 打印机对象(打印10份文件只需要一个打印机)
    以上对象只有唯一的一个存在

new 方法

  1. 使用类名()创建对象时,Python的解释器首先会调用new 方法为对象分配空间,new 方法是一个由Object类提供的内置静态方法,主要作用有两个:
  • 在内存中为对象分配空间
  • 返回对象的引用
  1. 在获得对象的引用后,将此引用作为第一个参数,传递给init方法

new 方法的重写

重写的目的:当使用类名()创建对象时,无论使用多少次,在内存中只会创建出一个对象的实例

  • 重写new 方法一定要return super().new(cls)
new 重写
class musicPlayer(object):
    def __new__(cls, *args, **kwargs):
        #1.为对象分配空间
        instance = super().__new__(cls)
        #2. 返回对象的引用
        return instance
    def __init__(self):
        print("播放器初始化")

player = musicPlayer()
print(player)
单例模式中的new 重写
class musicPlayer(object):
    #记录第一个被创建对象的引用
    instance = None
    def __new__(cls, *args, **kwargs):
        #1.判断类属性是否是空对象,如果是空对象证明还没有创建对象
        if (cls.instance is None):
            #2.调用父类的方法为第一个对象分配空间
            cls.instance = super().__new__(cls)
        #3.返回类属性保存的对象引用
        return  cls.instance

player1 = musicPlayer()
print(player1)
player2 = musicPlayer()
print(player2)
#输出结果: 输出结果player1 player2地址相同

执行上述代码后,每一次创建的对象地址虽然相同,但是init初始化方法仍然会在每次创建对象时被调用,现在需要初始化方法只在最初创建时调用一次:

class musicPlayer(object):
    #记录第一个被创建对象的引用
    instance = None
    #记录是否执行过初始化方法
    initFlag = False
    def __new__(cls, *args, **kwargs):
        #1.判断类属性是否是空对象,如果是空对象证明还没有创建对象
        if (cls.instance is None):
            #2.调用父类的方法为第一个对象分配空间
            cls.instance = super().__new__(cls)
        #3.返回类属性保存的对象引用
        return  cls.instance
    def __init__(self):
        #1. 判断是否执行过初始化方法
        if (musicPlayer.initFlag == True):
            return
        #2. 如果没有执行过则执行初始化方法
        print("初始化")
        #3. 修改类属性的值
        musicPlayer.initFlag = True

player1 = musicPlayer()
print(player1)
player2 = musicPlayer()
print(player2)

上述代码虽创建了两次对象,但是初始化方法init 只被调用了一次。


   转载规则


《Python(7)》 fightingtree 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录