Python_设计模式:单例模型

一、单例模型简介

代码的设计模式共有25种,不同的应用场景应用不同的设计模式,从而达到简化代码、利于扩展、提高性能等目的。本文简述Python实现的单例模式场景。简而言之,单例模式的应用场景是一个类对象被实例化多次,在这样的场景下应用单例模式可以减少对象重复创建的消耗,从而节约内存。

二、__new__方法

使用 类目() 创建对象时,python的解释器首先会调用__new__方法为对象分配空间,同时,__new__方法是一个由object基类提供的内置的静态方法,其作用是返回对象的引用。综上,__new__方法的作用有两个:

  1. 在内存中为对象分配空间
  2. 返回对象的引用

python的解释器获得对象的引用后,会将引用作为第一个参数传递给 __init__ 方法。

三、重写__new__方法

单例模型的原理就是对__new__方法进行重写,而重写new方法的代码非常固定,唯一值得注意的是一定要 return super().__new__(cls),否则python解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法。

注意__new__是一个静态方法,在调用是需要主动传递cls参数。

class MusicPlayer:

    # 记录第一个被创建对象的引用
    __instance = None

    # 重写__new__ 方法创建单例模型
    # 说明:__new__方法是object基类提供的一种静态方法。
    # 作用:1、为对象分配空间;2、返回对象引用
    def __new__(cls, *args, **kwargs):
        # 1、判断类属性是否为空引用,若为空则为对象分配空间
        if cls.__instance is None:
            print("这里还能执行其他只初始化一次的操作")
            cls.__instance = super().__new__(cls)
        # 返回对象引用
        return cls.__instance

    def __init__(self, name):
        self.name = name
        print(f"{self.name}播放器初始化完成")


# 创建多个对象
player1 = MusicPlayer("千千")
player2 = MusicPlayer("万万")
print(player1 is player2)

输出结果:

这里还能执行其他只初始化一次的操作
千千播放器初始化完成
万万播放器初始化完成
True
posted @ 2019-10-25 16:20  码上测  阅读(619)  评论(0编辑  收藏  举报