当前位置: 首页 > news >正文

单例模式介绍

【一】为什么要单例模式

单例设计模式:

  • 一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。

  • 当一个类的功能比较单一,只需要一个实例对象就可以完成需求时,就可以使用单例模式来节省内存资源。

【二】如何实现一个单例

  • 要实现一个单例,我们需要知道要重点关注的点是哪些?

    • 考虑对象创建时的线程安全问题

    • 考虑是否支持延迟加载

    • 考虑获取实例的性能是否高(是否加锁)

  • 在python中,我们可以使用多种方法来实现单例模式

    • 使用模块

    • 使用装饰器

    • 使用类(方法)

    • 基于__new__方法实现

    • 基于元类metaclass实现

# 创建一个普通的类
class Student:...
​
​
# 实例化类得到对象 --- 类只要加 () 实例化就会产生一个全新的对象
# 查看对象  --- 发现虽然是同一个类实例化得到的对象,但是对象的地址不一样
# 每次使用都要重新打开,内存占用过高
stu_one = Student()
print(id(stu_one))  # 1764834580640
stu_two = Student()
print(id(stu_two))  # 1764834304080

单例模式的实现

# 方式一:
class MyType(type):def __init__(cls,class_name,class_bases,class_name_space):# 给自己的类中加一个属性 instance 初始值是nonecls.instance = Nonesuper().__init__(class_name,class_bases,class_name_space)
​def __call__(self, *args, **kwargs):obj = super().__call__(*args,**kwargs)# 判断 只要有就返回他不创建,没有就创建再返回if not self.instance:self.instance =objreturn self.instance
​
​
class Student(metaclass=MyType):...
​
​
stu_one = Student()
print(id(stu_one))      # 2645492891216
stu_two = Student()
print(id(stu_two))      # 2645492891216
​
# 定制类的属性 ---》 元类 __init__
# 定制对象的属性 ---> 元类 __call__
​
​
# 方式二
# 使用装饰器
# outer 接受cls类作为参数
def outer(cls):# 定义一个字典,键为cls,初始值为none,永远存储cls的单例实例instance = {'cls':None}
​def inner(*args, **kwargs):# 使用nonlocal关键字声明 instance变量,这意味着inner函数将修改在outer函数中定义的instance变量,而不是创建一个新的nonlocal instance# 进行判断是否有clsif not instance['cls']:instance['cls'] = cls(*args, **kwargs)return instance['cls']
​return inner
​
​
@outer
class Student:...
​
​
stu_one = Student()
print(id(stu_one))      # 1384468577632
stu_two = Student()
print(id(stu_two))      # 1384468577632

相关文章:

单例模式介绍

【一】为什么要单例模式 单例设计模式: 一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。 当一个类的功能比较单一,只需要一个实例…...

Facebook企业户/在Facebook上做推广有什么好处?

想到出海,必会想到Facebook作为世界上最大的社交网络,Facebook拥有难以想象的用户数量,流量大到没朋友。近年来也是独立站卖家获取流量的有力工具之一。独立站卖家在Facebook上做广告的好处? Facebook,Google 开企业广…...

Go GORM实战(二) | 数据库连接的N种方式

连接数据库 使用GORM连接数据库还是比较简单的,概括起来就是以下三个步骤: 引入gorm.io/gorm和对应数据库的驱动库,如gorm.io/driver/sqlite。 调用对应驱动库的Open()或New()函数返回一个实现了gorm.Dialector接口的实例。 调用gorm.Open…...

Cocos Creator 2D Mask与Layout 使用详解

Cocos Creator是一款强大的2D游戏开发引擎,提供了丰富的功能和工具,使开发者可以轻松创建出高质量的游戏。其中,2D Mask和Layout是Cocos Creator中常用的两个组件,它们可以帮助开发者实现更加复杂和精美的游戏界面设计。本文将详细…...

项目-坦克大战

增加功能 我方坦克在发射的子弹消亡后,才能发射新的子弹。同时实现发多颗子弹 1,在按下J键,我们判断当前hero对象的子弹,是否已经销毁2,如果没有销毁,就不去触发shotEnemyTank3,如果已经销毁&…...

代码随想录算法训练营第二十九天| LeetCode491.递增子序列* 、LeetCode46.全排列*、LeetCode47.全排列 II

#LeetCode 491. Non-decreasing Subsequences #LeetCode 491. 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 首先,本题不能考虑首先对数组排序,排序会导致数组直接变为一个…...

基于SpringBoot设计模式之开端

文章目录 前言引言开始 前言 为了更好的在项目中,能更加优雅的使用设计模式,比较针对性的解决我们的问题。我将在这个专栏详细的描述23种设计模式,为了与时俱进,我打算通过springboot的形式将23种设计模式全部撸完! 引…...

tensorflow实现二分类

# 导入所需库和模块 from tensorflow.keras.layers import Dense, Input, Activation # 导入神经网络层和激活函数模块 from tensorflow.keras.models import Sequential # 导入Keras的Sequential模型 import pandas as pd # 导入Pandas库用于数据处理 import numpy as np …...

简化路径[中等]

优质博文:IT-BLOG-CN 一、题目 给你一个字符串path,表示指向某一文件或目录的Unix风格 绝对路径 (以/开头),请你将其转化为更加简洁的规范路径。在Unix风格的文件系统中,一个点.表示当前目录本身&#x…...

记一次若依项目组装树型结构数据的效率优化

背景 最近公司的项目使用了若依框架做开发,发现部门管理功能的部门如果有3万笔记录时,查询部门信息并组装为父子结构时运行特别缓慢,本地运行需要3分钟才能加载出来,因此接到优化的工作。 代码展示 首先看看表结构是这么定义的…...

秒杀系统之系统优化

3 系统优化 对于一个软件系统,提高性能可以有很多种手段,如提升硬件水平、调优JVM 性能,这里主要关注代码层面的性能优化—— 减少序列化:减少 Java 中的序列化操作可以很好的提升系统性能。序列化大部分是在 RPC 阶段发生&#x…...

【介绍下Python多线程,什么是Python多线程】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...

FPGA相关论文阅读

一、Achieving 100Gbps Intrusion Prevention on a Single Server 论文名称中文翻译:在单台服务器上实现100Gbps吞吐量的入侵防御检测。 文章中的Mixed-1和Norm-1 二、Distributed Password Hash Computation on Commodity Heterogeneous Programmable Platforms…...

瑞芯微RK3588驱动设计之DVP并口摄像头2

dts配置看瑞芯微RK3588驱动配置之DVP并口摄像头1_rockchip 调试dvp设备 直接显示摄像头数据-CSDN博客 这里看看驱动的具体实现,以gc2145为例。 gc2145的驱动源码如下: // SPDX-License-Identifier: GPL-2.0 /** GC2145 CMOS Image Sensor driver*** C…...

安卓手机APP开发__支持64位的架构

安卓手机APP开发__支持64位的架构 目录 概述 读取你的APP 快速的状态检查 你的APP使用了原生的代码吗? 你的APP包含了64位的代码库吗? 确保在这些目录中有原生的代码库. 使用APK分析器查看原生的代码库 通过解压缩APK查看原生的代码库 用安卓工…...

Foxmail使用经验总结

目录 1.概述 2.版本历史 3.使用方法 3.1.安装和设置账户 3.2.收取和阅读邮件 ​​​​​​​3.3.发送邮件 ​​​​​​​3.4.管理联系人 ​​​​​​​3.5.日程安排和任务管理 ​​​​​​​3.6.定制设置和插件 ​​​​​​​3.7.跨平台同步 4.小结 1.概述 Fox…...

信息系统项目管理师0601:项目立项管理 — 考点总结(可直接理解记忆)

点击查看专栏目录 项目立项管理 — 考点总结(可直接理解记忆) 1.项目建议书(又称立项申请)是项目建设单位向上级主管部门提交项目申请时所必须的文件,是对拟建项目提出的框架性的总体设想。在项目建议书批准后,方可开展对外工作(掌握)。 2.项目建议书应该包括的核心内…...

实验三:机器学习1.0

要求: 针对实验1和实验2构建的数据集信息分析 设计实现通过数据简介进行大类分类的程序 代码实现: 训练集数据获取: read_data.py import json import pickledef read_intro():data []trypathr"E:\Procedure\Python\Experiment\f…...

Vue 3 + Vite项目实战:常见问题与解决方案全解析

文章目录 一、项目使用本地图片打包后不显示1、在html中时候,本地运行和打包后线上运行都ok。2、用动态数据,本地运行ok,打包后线上运行不显示3、适用于处理单个链接的资源文件4、用动态数据且本地和线上访问都可显示 二、使用插件vite-plugi…...

飞天使-k8s知识点31-rancher的正确打开方式

文章目录 安装之前优化一下内核参数以及系统内核版本 rancher安装主要是使用以下命令nginx的配置为解决办法 安装之前优化一下内核参数以及系统内核版本 内核版本 4.17 cat > /etc/modules-load.d/iptables.conf <<EOF ip_tables iptable_filter EOF 然后重启服务器…...

3步完成Arch Linux现代化桌面环境:Hyprland自动化安装终极指南

3步完成Arch Linux现代化桌面环境&#xff1a;Hyprland自动化安装终极指南 【免费下载链接】Arch-Hyprland For automated installation of Hyprland on Arch Linux or any Arch Linux-based distros 项目地址: https://gitcode.com/gh_mirrors/ar/Arch-Hyprland 想要在…...

基于Vue3+TypeScript的ChatGPT风格前端界面集成实战

1. 项目概述与核心价值最近在折腾一个个人项目&#xff0c;想给一个静态网站加上智能对话的能力&#xff0c;让访客能随时问点问题。一开始想自己从零搭建&#xff0c;但考虑到前后端、AI接口、实时通信这些环节&#xff0c;工作量着实不小。后来在GitHub上逛的时候&#xff0c…...

codex出现Reconnecting和stream disconnected before completion:stream closed before response.complete解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

技术解析【无人机实时建图】 - DenseFusion:如何实现CPU上的大规模密集点云与DSM在线融合

1. DenseFusion框架的核心价值 第一次接触DenseFusion时&#xff0c;最让我惊讶的是它在普通笔记本电脑CPU上就能跑出实时建图效果。要知道传统无人机建图方案要么依赖昂贵GPU&#xff0c;要么需要后期数小时处理。这个框架通过三个关键创新点实现了突破&#xff1a;虚拟立体对…...

Space Thumbnails:Windows资源管理器的终极3D模型预览解决方案

Space Thumbnails&#xff1a;Windows资源管理器的终极3D模型预览解决方案 【免费下载链接】space-thumbnails Generates preview thumbnails for 3D model files. Provide a Windows Explorer extensions that adds preview thumbnails for 3D model files. 项目地址: https…...

小米Tag防丢器深度解析:BLE与UWB双技术路径如何重塑寻物体验

1. 项目概述&#xff1a;小米入局&#xff0c;防丢市场迎来“鲶鱼”在智能硬件领域&#xff0c;防丢追踪器一直是个不温不火但又刚需明确的存在。苹果的AirTag凭借其庞大的Find My网络&#xff0c;几乎定义了行业标准&#xff0c;但也因其生态封闭性&#xff0c;让安卓用户望而…...

ChartGPT:用自然语言重塑数据可视化的智能革命

ChartGPT&#xff1a;用自然语言重塑数据可视化的智能革命 【免费下载链接】chart-gpt AI tool to build charts based on text input 项目地址: https://gitcode.com/gh_mirrors/ch/chart-gpt 在数据驱动决策的时代&#xff0c;图表已成为信息传递的通用语言。然而&…...

2025年macOS菜单栏终极管理方案:开源神器Ice让你的工作区重获新生

2025年macOS菜单栏终极管理方案&#xff1a;开源神器Ice让你的工作区重获新生 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice macOS菜单栏管理工具Ice是一款完全免费的开源神器&#xff0c;专为现代…...

STM32H743实战笔记:用SN65HVD230驱动14个伺服电机,1M波特率稳不稳?

STM32H743工业级CAN总线实战&#xff1a;14伺服电机集群控制与SN65HVD230极限测试 在工业机器人关节控制领域&#xff0c;多电机协同作业对总线通讯的实时性和稳定性提出严苛要求。最近完成的一个AGV底盘项目让我对STM32H743的CANopen主站性能有了全新认识——当需要同时驱动14…...

使用taotoken后matlab调用大模型api的延迟与稳定性体验分享

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用taotoken后matlab调用大模型api的延迟与稳定性体验分享 1. 背景与接入动机 在数据处理与科学计算项目中&#xff0c;我们经常…...