zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    数据结构—堆排序
    关于《数据结构》课本KMP算法的理解
    KMP字符串匹配算法
    POJ 3784 Running Median(动态维护中位数)
    C++ STL 全排列
    数据结构——哈夫曼(Huffman)树+哈夫曼编码
    算法与数据结构实验6:逆序对(归并排序)
    C++ STL 优先队列 priority_queue 详解(转)
    现在和未来
    Karen and Coffee CF 816B(前缀和)
  • 原文地址:https://www.cnblogs.com/testlearn/p/11738661.html
Copyright © 2011-2022 走看看