python单例模式有什么用_python单例模式是什么

article/2025/8/21 16:17:04

在python中,单例模式是一种常用的软件设计模式,该模式的主要目的是确保某一个类在内存中只能有一个实例对象;通过单例模式的方法创建的类在当前进程中只有一个实例对象。单例模式分为:1、懒汉式,类一加载就创建对象;2、饿汉式,用时才去创建对象。

5ce607d3732ae777.jpg

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。

单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

在 Python 中,我们可以用多种方法来实现单例模式:

使用模块

使用 __new__

使用装饰器(decorator)

使用模块

其实,Python 的模块就是天然的单例模式。

因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。

如果我们真的想要一个单例类,可以考虑这样做:#tests1.py

class MyClass(object):

def foo(self):

print('MyClass.foo')

my_class_obj=MyClass()

将上面的代码保存在文件 tests1.py 中,然后这样使用:from .tests1 import my_class_obj

my_class_obj.foo()

使用 __new__

为了使类只能出现一个实例,我们可以使用 __new__ 来控制实例的创建过程,代码如下:class MyClass(object):

_instance = None

def __new__(cls, *args, **kwargs):

if not cls._instance:

cls._instance = super(MyClass, cls).__new__(cls, *args, **kwargs)

return cls._instance

class HerClass(MyClass):

a = 1

在上面的代码中,我们将类的实例和一个类变量 _instance 关联起来,如果 cls._instance 为 None 则创建实例,否则直接返回 cls._instance。

执行情况如下:one = HerClass()

two = HerClass()

print(one == two) #True

print(one is two) #True

print(id(one), id(two)) #42818864 42818864

使用装饰器

我们知道,装饰器(decorator)可以动态地修改一个类或函数的功能。这里,我们也可以使用装饰器来装饰某个类,使其只能生成一个实例,代码如下:from functools import wraps

def singleton(cls):

instances = {}

@wraps(cls)

def getinstance(*args, **kwargs):

if cls not in instances:

instances[cls] = cls(*args, **kwargs)

return instances[cls]

return getinstance

@singleton

class MyClass(object):

a = 1

在上面,我们定义了一个装饰器 singleton,它返回了一个内部函数 getinstance,该函数会判断某个类是否在字典 instances 中,如果不存在,则会将 cls 作为 key,cls(*args, **kw) 作为 value 存到 instances 中,否则,直接返回 instances[cls]。

以上就是python单例模式是什么的详细内容,更多请关注php中文网其它相关文章!

article_wechat2021.jpg?1111

本文原创发布php中文网,转载请注明出处,感谢您的尊重!


http://chatgpt.dhexx.cn/article/20x5Pg38.shtml

相关文章

Python设计模式-单例模式

设计思想 通过上面的介绍,我们可以知道单例模式最重要的就是要保证一个类只有一个实例并且这个类易于被访问,那么要怎么做才能保证一个类具有一个实例呢?一个全局变量使得一个对象可以被访问,但是这样做却不能防止你实例化多个对…

redis常用命令

redis常用命令 服务端客户端 服务端 1.使用help查看帮助文档 redis-server --help2.启动redis服务 sudo service redis start3.停止redis服务 sudo service redis stop4.重启redis服务 sudo service redis restart如果上面命令不行,用下面的命令: …

运维维护服务器redis常用命令

查看服务器是否有redis ps -ef | grep redis知道有redis存在了,查看下redis状态 systemctl status redis知道redis状态是运行态和只能本机访问后,想查看redis配置文件位置 cat /etc/systemd/system/redis.service知道redis配置在哪里,修改…

redis启动,停止,重启

1、查看redis是否在运行: ps aux | grep redis 2、启动redis: /etc/init.d/redis start 3、关闭redis:redis-cli shutdown 4、当设置密码后, 上面的关闭命令无效:带密码输入:redis-cli -a [password] 回…

centos中常用与redis相关的命令

该篇指令只针对完全不懂Linux,但是却不得不配置redis的同学(没错就是我) 安装过程就不阐述了,默认都安好了嗷。 启动redis 首先进入到redis安装位置的bin目录下,路径因人而异,这里用本人的路径作为示例 …

Linux重启 Redis自动启动

今天又要维护新的服务器了,翻了一下网上Redis自动启动,结果配置一大堆,其实很多没什么用,也不好理解,所以干脆把我自己的记录给写这里给大家参考。 第一步:创建Redis启动服务 在系统开机启动项目录 /lib/…

windows 重启redis的方法

目录 打开本地的文件夹 选中文件的路径输入cmd 在cmd命令窗口中输入以下的指令 指令的内容以及对应的命令含义 前言: 最近在本地搭建redis环境,突然发现本地的redis启动失败了,使用reids的启动命令也不行,于是找了不少的方法&…

redis linux 重启命令行,redis 如何重启? linux下请输入命令不要用kill 的方式

噜噜哒 1、如果是用apt-get或者yum install安装的redis,可以直接通过下面的命令停止/启动/重启redis:/etc/init.d/redis-server stop/etc/init.d/redis-server start/etc/init.d/redis-server restart2、如果是通过源码安装的redis,则可以通过…

redis重启命令Linux,Redis启动、配置 及 常用命令-Go语言中文社区

启动 Redis 服务 src/redis-server或者src/redis-server redis.conf 注:src/redis-server 会不加载redis.conf配置文件,提示: Warning: no config file specified, using the default config. 标题 而:src/redis-server redis.conf 为载入redis.conf配置的启动方式 标题 sr…

Windows环境下redis重启

在redis安装的目录下打开cmd窗口 输入以下命令打开启动redis redis-server redis.windows.conf 如果提示 Creating Server TCP listening socket *:6379: bind: No error,需要重启redis 一、重启步骤: 1、依次输入以下指令 redis-cli -h 127.0.0.1…

如何停止/重启/启动Redis服务

如何停止/重启/启动Redis服务 一、命令行直接启动/停止/重启redis1、启动redis服务及验证2、停止redis服务及验证3、重启redis服务及验证 二、通过redis的相关配置信息关闭/启动redis1.关闭 redis服务及验证2.启动redis服务及验证 叮嘟!最近做项目学习用到了Redis&a…

如何停止重启启动Redis服务

如何停止/重启/启动Redis服务 一、命令行直接启动/停止/重启redis 1、启动redis服务及验证2、停止redis服务及验证3、重启redis服务及验证 二、通过redis的相关配置信息关闭/启动redis 1.关闭 redis服务及验证2.启动redis服务及验证 叮嘟!最近做项目学习用到了Re…

语音识别,标注数据

切割音频文件 from pydub import AudioSegment from pydub.silence import split_on_silence import ossound AudioSegment.from_mp3("E:/data/AcsData/zfBX/hw202003301111246_23401.wav") loudness sound.dBFS outputPath "E:/data/AcsData/zfBX/output/&…

音频标注工具

ASR音频标注工具 前言一、音频标注工具二、使用环境总结 前言 为了方便查看音频标注质量,使用图形化音频标注工具可以更方便的对音频文本内容进行编辑。 下载链接: https://download.csdn.net/download/weixin_54971024/85426511 一、音频标注工具 主页…

数据标注工具、平台、类型

华为云ModelArts标注工具,支持的标注类型有: 图片: imgClassify 图像分类:识别一张图片中是否包含某种物体 objDetect 物体检测:识别出图片中每个物体的位置及类别 imgSevering 图像分割:根据图片中的物体…

Python-实现语音识别并批处理标注(重命名)文件

由于我的测试经常需要对音频文件内容标注(根据语音的内容用拼音标注),一个一个人工标注很费时费力!那有没有简单点的方法,答案是有!!!一起学习吧~ 1.在百度AI开发平台获取AppID、AP…

景联文科技提供语音数据采集标注服务

什么是语音标注? 语音标注是数据标注行业中一种常见的标注类型,是由标注员对语音信息进行不断标注转写,让人工系统进行进一步学习,标注后的数据主要用于人工智能机器学习,相当于给计算机系统装上了“耳朵”&#xff0…

语音数据标注工具与平台/公司

最近在做语音深度学习的项目,整理了一下语音数据标注工具和语音标注平台,供大家参考 语音标注工具--Praat Praat是目前已经成为比较流行也比较专业的语音处理的软件,可以进行语音数据标注、语音录制、语音合成、语音分析等等,具有…

语音标注必须了解的基础知识点

昨天发了一遍关于语音数据标注工具Praat的基础使用,后台收到了很多小伙伴的留言,想了解一下更多的语音相关的知识,也想深入的学习一下,所以今天继续写一篇关于语音相关的基础知识,不管是数据标注还是刚了解语音相关AI技…