首页 > 编程语言 >【进阶12】【自学笔记】Python单例模式实现的几种方式

【进阶12】【自学笔记】Python单例模式实现的几种方式

时间:2023-04-16 23:57:52浏览次数:35  
标签:__ Singleton 12 进阶 Python instance 实例 单例 cls

一、单例模式定义

单例模式是一种常用的创建型设计模式,它保证一个类只有一个实例,并提供一个全局的访问点。

二、实例展示

实例1:

class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

在这个示例中,我们定义了一个名为 Singleton 的类,其中包含了一个类变量 _instance,初始值为 None。在 __new__ 方法中,我们首先检查 _instance 变量是否为 None,如果是,则说明当前尚未创建过该类的实例,我们调用父类 super().__new__(cls) 创建一个新的实例,并将其保存在 _instance 中;否则,直接返回已存在的实例。

使用时,我们可以像下面这样来创建 Singleton 的实例:

s1 = Singleton()
s2 = Singleton()

assert s1 is s2  # True

以上面的代码为例,因为 Singleton 的实例只能有一个,所以 s1 和 s2 其实是同一个实例对象,因此 s1 is s2 的结果为 True。  

实例2:

Python 还提供了一种更简洁的方式来实现单例模式,那就是使用 call 方法。具体而言,我们只需要将要实现单例模式的类定义为一个 callable 对象,并在类中定义 call 方法,这个类的实例就可以像函数一样被调用了  

class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

    def __call__(cls, *args, **kwargs):
        return cls._instance

在这个示例中,我们定义了一个名为 Singleton 的类,其中包含了一个类变量 _instance 和一个 __call__ 方法。在 __call__ 方法中,我们直接返回 _instance 变量,这样当我们像调用函数一样调用 Singleton 的实例时,实际上返回的是同一个对象。

使用时,我们可以像下面这样来创建 Singleton 的实例:

s1 = Singleton()
s2 = Singleton()

assert s1 is s2  # True

以上面的代码为例,因为 Singleton 的实例只能有一个,所以 s1 和 s2 其实是同一个实例对象,因此 s1 is s2 的结果为 True  

实例3:

使用装饰器:装饰器可以用于装饰一个类,使其在实例化时返回同一对象。具体实现方式与以上的元类类似。

def singleton(cls):
    _instances = {}

    def get_instance(*args, **kwargs):
        if cls not in _instances:
            _instances[cls] = cls(*args, **kwargs)
        return _instances[cls]

    return get_instance

@singleton
class MySingleton:
    pass

s1 = MySingleton()
s2 = MySingleton()

print(s1 is s2)  # 输出:True

实例4:

使用模块:Python 中的模块是天然的单例,因为在导入模块时只会执行一次初始化代码,后续的导入操作都是返回同一份已经初始化过的对象。因此可以将需要实现单例的类定义在一个模块中,直接导入该模块即可获得该类的唯一实例。

# singleton.py
class MySingleton:
    pass

my_singleton = MySingleton()  # 创建唯一实例

# main.py
from singleton import my_singleton

print(my_singleton)  # 输出:<singleton.MySingleton object at 0x7f5d5e9780f0>

以上4种实现方式都可以达到单例模式的效果,其中使用模块的方式代码量最少,但有些情况下可能不太灵活;使用元类和装饰器的方式代码量较多,但可以更加灵活地控制单例的创建过程。  

  

 

标签:__,Singleton,12,进阶,Python,instance,实例,单例,cls
From: https://www.cnblogs.com/xfbk/p/17324485.html

相关文章

  • LeetCode Top100: 爬楼梯 (python)
     假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例1:输入:n=2输出:2解释:有两种方法可以爬到楼顶。1.1阶+1阶2.2阶示例2:输入:n=3输出:3解释:有三种方法可以爬到楼顶。1.1阶+1......
  • Python Numpy Tutorial
    pythonPython是一种高层次的,动态类型多范型编程语言。Python代码是经常被认为是几乎像伪代码,因为它可以让你同时是非常可读表达的代码非常少的线很强大的想法。作为一个例子,这里是在Python经典的快速排序算法的实现:defquicksort(arr):iflen(arr)<=1:returnarr......
  • [PLC]S7-1200 串行通信
    S7-1200串行通信S7-1200支持的串行通讯方式· 点对点(PtP)通信· Modbus主从通信· USS通信 名称CM1241RS232CM1241RS422/485CB1241RS485订货号6ES7241-1AH32-0XB06ES7241-1CH32-0XB06ES7241-1CH30-1XB0通讯口类型RS232RS422/RS485......
  • 12.shell 函数应用
    1.什么是函数函数其实就是一堆命令的集合,用来完成一些特定的代码块。作用:便于代码的复用,跟脚本类似2.函数的基本概述#定义函数#第一种函数名(){  命令集合}#第二种function函数名{  命令集合}#示例  2.函数状态返回  3.状态返回案例 ......
  • 第 12 章Linux 实操篇-网络配置
    第12章Linux实操篇-网络配置目录第12章Linux实操篇-网络配置13.1Linux网络配置原理图13.1.1画出原理图,帮助理解13.2查看网络IP和网关13.2.1查看虚拟网络编辑器和修改IP地址13.2.2查看网关13.3查看windows环境的中VMnet8网络配置(ipconfig指令)13.4查看lin......
  • LeetCode-Top100: 有效的括号 (python)
     给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。 示例1:输入:s="()"输出:true示例 2:输入:s="()[]{}"输......
  • NumPy 秘籍中文第二版:一、使用 IPython
    在本章中,我们将介绍以下秘籍:安装IPython使用IPython作为Shell阅读手册页安装matplotlib运行IPython笔记本导出IPython笔记本导入网络笔记本配置笔记本服务器探索SymPy配置文件简介IPython,可从ipython.org获得,是一个免费的开源项目,可用于Linux,Unix,MacOSX,和Windows......
  • Python 智能项目:1~5
    原文:IntelligentProjectsUsingPython协议:CCBY-NC-SA4.0译者:飞龙本文来自【ApacheCN深度学习译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。不要担心自己的形象,只关心如何实现目标。——《原则》,生活原则2.3.c一、人工智能系统的基础人工智能(AI)在过去几年中一直......
  • thinkphp: 用redis存储短信验证码(thinkphp v6.0.12LTS)
    一,配置redis1,编辑.env[REDIS0]TYPE=redisHOST=127.0.0.1PORT=6379PASSWORD=2,config/cache.php<?php//+----------------------------------------------------------------------//|缓存设置//+----------------------------------------------------......
  • TensorFlow 智能移动项目:11~12
    原文:IntelligentmobileprojectswithTensorFlow协议:CCBY-NC-SA4.0译者:飞龙本文来自【ApacheCN深度学习译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。不要担心自己的形象,只关心如何实现目标。——《原则》,生活原则2.3.c十一、在移动设备上使用TensorFlowLite......