首页 > 编程语言 >Python单例模式

Python单例模式

时间:2023-03-09 12:12:53浏览次数:34  
标签:Singleton 单例 Python singleton 模式 模块 cls

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

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

事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。

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

使用模块

使用装饰器

使用类

基于 new 方法实现

基于 metaclass 方式实现

下面来详细介绍:

1、使用模块
其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。

因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。

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

class Singleton(object):
def foo(self):
pass
singleton = Singleton()
将上面的代码保存在文件 mysingleton.py 中,要使用时,直接在其他文件中导入此文件中的对象,这个对象即是单例模式的对象

from mysingleton import singleton
2、使用装饰器
def Singleton(cls):
_instance = {}

def _singleton(*args, **kargs):
    if cls not in _instance:
        _instance[cls] = cls(*args, **kargs)
    return _instance[cls]

return _singleton

@Singleton
class A(object):
a = 1

def __init__(self, x=0):
    self.x = x

a1 = A(2)
a2 = A(3)

标签:Singleton,单例,Python,singleton,模式,模块,cls
From: https://www.cnblogs.com/clark1990/p/17197903.html

相关文章

  • python连接mysql
    conn=pymysql.connect(host="127.0.0.1",port=3306,user="root",password="root",database="mydatabase",charset="utf8")cur=conn.cursor(cursor=pymysql.cursor......
  • Python基本语法 -- 变量、运算、字符串
    对象要存储一个对象需要包括id(标识,对象一旦创建id永不改变,在内存中的位置)、type(类型,当前对象的类型,决定其功能)和value(值,存储的具体值)根据其值能否更改进行分类,可分为可......
  • python+playwright 学习-26 locator.filter()过滤定位器
    前言locator.filter()方法可以对locator定位到的元素进行筛选过滤,可以按文本过滤,也可以按locator定位器过滤。locator.filter()文本过滤考虑以下DOM结构,我们要在其......
  • Python学习日志
    面对if语句,python和java和C不同的是,python更多的是if条件1语句:内容elif条件2语句:内容else:内容 #上面所有条件都不满足,则运行该条件语句下的。 0A=int(input()......
  • 【编程基础之Python】12、Python中的语句
    (【编程基础之Python】12、Python中的语句)Python中的语句Python是一种高级编程语言,具有简单易学的语法,适用于各种编程任务,包括数据分析、机器学习和Web开发等。本文将详......
  • python+playwright 学习-25 expect 常用的断言方法
    前言playwright提供了一个expect方法用于断言expect使用断言描述expect(locator).to_be_checked()Checkboxischeckedexpect(locator).to_be_disable......
  • Spring设计模式——原型模式
    原型模式原型模式(PrototypePattern),是指原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。原型模式主要适用于以下场景:类初始化消耗资源较多使用new生......
  • 前端设计模式——中介者模式
    前端中介者模式(MediatorPattern),用于将对象之间的通信解耦并集中管理。它通过引入一个中介者对象,将对象之间的交互转移到中介者对象中,从而避免对象之间直接相互通信。在前......
  • python 批量提取.txt文件的前缀名称
    importtkinterastk#导入tkinter库设置别名tkimportosimporttimeimportglobroot=tk.Tk()#生成主窗口root.title('文件提取器')#设置窗体名字root......
  • 23-解释器模式
    23-解释器模式概念解释器模式(interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。如果一种特定类型的问题发生......