【新人系列】Python 入门(二十六):常见设计模式
✍ 个人博客:https://blog.csdn.net/Newin2020?type=blog
📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html
📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们一起交流~
📚 专栏简介:在这个专栏,我将带着大家从 0 开始入门 Python 的学习。在这个 Python 的新人系列专栏下,将会总结 Python 入门基础的一些知识点,方便大家快速入门学习~
❤️ 如果有收获的话,欢迎点赞 👍 收藏 📁 关注,您的支持就是我创作的最大动力 💪
1. 设计模式
1.1 介绍
设计模式是一种解决特定问题的经验、一种通用的解决方案,它有如下优点:
- 提高代码可重用性(重点)
- 提供代码的扩展性(重点)
- 提高可读性
- 提高软件的性能、效率
- 提高代码的维护性
1.2 设计模式分类
设计模式通常根据其目的和用途进行分类,常见的分类包括:
- 创建型模式:工厂方法模式、抽象工厂模式、单例模式等
- 结构型模式:适配器模式、桥接模式、装饰器模式等
- 行为型模式:策略模式、观察者模式、责任链模式等
2. 单例模式
单例模式是一种设计模式,它的核心是确保一个类只有一个实例存在。
单例模式的主要应用场景包括:
- 资源共享:例如数据库连接、文件系统等,只需要一个共享的资源控制实例。
- 全局状态管理:需要一个统一的地方来管理全局状态。
通过单例设计模式,可以避免多个对象创建导致的性能开销、防止多线程带来的多实例化问题,也可以针对一些敏感的资源做访问限制。
2.1 使用模块实现
最简单的方式就是通过模块实现单例模式的功能,因为从其它地方导入模块,这个模块肯定只有一个来源。
2.1.1 my_test.py
class Singleton:def __init__(self, name):self.name = namedef do(self):passa = Singleton("张三")
2.1.2 app.py
from my_test import a
2.2 使用装饰器实现
上述实现方法过于简单,没有什么含金量,一般面试的时候也肯定是想问如何用装饰器的方式来实现。因此,下面来看看装饰器是如何实现的,下述代码中:
- singleton 是一个装饰器函数,它维护了一个字典 instances 来存储已经创建的类实例。
- 当每次调用被装饰的类时,如果该类的实例还不存在,就创建一个新的实例并存储在 instances 中;如果已经存在,就直接返回已有的实例。
这样就保证了 MySingleton 类始终只有一个实例被创建和使用。
def singleton(cls):instances = {} # 创建一个空字典def get_instance(*args, **kwargs):"""判断空字典中是否已经存在cls类:- 如果不存在,就新创建一个类对象,并存放到字典中- 如果存在,直接返回存在字典中的类对象"""if cls not in instances:instances[cls] = cls(*args, **kwargs)return instances[cls]return get_instance@singleton
class MySingleton:def __init__(self):self.data = "This is a singleton instance"instance1 = MySingleton()
instance2 = MySingleton()print(instance1 is instance2) # True
2.3 使用 new 方法实现
另外,new 的实现方法也和装饰器有异曲同工之处,下述代码中:
- 首先定义了一个类属性 _instance ,初始值为 None ,用于存储单例对象的引用。
- new 是一个特殊的方法,用于控制对象的创建过程。而在 new 方法中,如果 _instance 为 None ,就通过 super().new(cls) 创建一个新的对象,并将其赋值给 _instance 。
- 后续再次调用创建对象时,直接返回已经创建好的 _instance ,从而保证始终只有一个实例存在。
class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if cls._instance is None:cls._instance = super().__new__(cls)return cls._instances1 = Singleton()
s2 = Singleton()print(s1 is s2) # True
3. 工厂模式
工厂模式也是常用的设计模式之一,它是一种创建对象的设计模式。它的核心思想是将对象的创建与使用分离,通过一个工厂类来负责创建对象,即将实例化对象的过程封装起来,而客户端就不需要知道具体的创建细节。
工厂模式主要有三种形式:简单工厂模式、工厂方法模式和抽象工厂模式。
3.1 简单工厂模式
3.1.1 特点
- 定义一个工厂类,具有一个创建对象的方法。
- 根据传入的参数决定创建哪种具体的产品对象。
3.1.2 优缺点
- 优点
- 实现了对象创建和使用功能的分离,客户端不需要知道对象是如何创建的,只需要使用工厂提供的方法获取对象即可。
- 集中了对象的创建逻辑,使得代码更具可读性和可维护性。
- 缺点
- 不符合开闭原则,即当需要添加新的产品时,需要修改工厂类的创建逻辑。
- 工厂类的职责过重,可能会变得复杂和难以维护,如果产品种类过多,工厂类可能会变得庞大。
3.1.3 示例代码
假设我们有一个生产不同类型汽车的场景,有 “经济型轿车” 和 “豪华型轿车” 两种类型。在下述代码中:
- Car 是一个抽象的基类,EconomyCar 和 LuxuryCar 是具体的汽车类型,它们继承自 Car 类并实现了 drive 方法。
- CarFactory 是工厂类,它的 create_car 方法根据传入的参数创建相应类型的汽车对象。
from abc import ABC, abstractmethod# 抽象类
class Car(ABC):@abstractmethoddef drive(self):passclass EconomyCar(Car):def drive(self):print("Driving an economy car")class LuxuryCar(Car):def drive(self):print("Driving a luxury car")class CarFactory:def create_car(self, car_type):if car_type == 'economy':return EconomyCar()elif car_type == 'luxury':return LuxuryCar()# 客户端代码
factory = CarFactory()economy_car = factory.create_car('economy')
economy_car.drive()luxury_car = factory.create_car('luxury')
luxury_car.drive()
Tips:抽象类
如果一个类继承自 ABC,且其中的方法加上了 @abstractmethod 的标签,那么这个类就是抽象类,它只能被其它类继承且其中的方法不能被实例化。
3.2 工厂方法模式
3.2.1 特点
- 在工厂方法模式中,不再由一个单一的工厂类来创建所有的产品对象,而是为每种产品都提供一个具体的工厂类,这些工厂类都有一个共同的父类(抽象工厂类),其中定义了一个抽象的工厂方法。
- 每个具体的工厂类负责创建一种特定类型的产品对象。
3.2.2 优点
- 符合开闭原则:当需要添加新的产品时,不需要修改现有的工厂类,只需要添加一个新的具体工厂类和对应的产品类即可。
- 解耦了产品的创建和使用:客户端只需要知道抽象工厂和抽象产品的接口,而不需要关心具体的产品创建细节。
3.2.3 示例代码
在下述示例中:
- Product 是抽象产品类,ConcreteProduct1 和 ConcreteProduct2 是具体的产品类。
- Factory 是抽象工厂类,定义了抽象的创建产品的方法 create_product 。
- ConcreteFactory1 和 ConcreteFactory2 是具体的工厂类,分别负责创建对应的具体产品。
from abc import ABC, abstractmethod# 抽象产品类
class Product(ABC):@abstractmethoddef show(self):pass# 具体产品类 1
class ConcreteProduct1(Product):def show(self):print("This is ConcreteProduct1")# 具体产品类 2
class ConcreteProduct2(Product):def show(self):print("This is ConcreteProduct2")# 抽象工厂类
class Factory(ABC):@abstractmethoddef create_product(self):pass# 具体工厂类 1
class ConcreteFactory1(Factory):def create_product(self):return ConcreteProduct1()# 具体工厂类 2
class ConcreteFactory2(Factory):def create_product(self):return ConcreteProduct2()# 客户端代码
factory1 = ConcreteFactory1()
product1 = factory1.create_product()
product1.show()factory2 = ConcreteFactory2()
product2 = factory2.create_product()
product2.show()
Tips:
- ABC 是 Abstract Base Class 的缩写,用于定义抽象基类。
- abstractmethod 装饰器用于将一个方法标记为抽象方法。抽象方法是没有实现的方法,子类必须实现这些抽象方法,否则子类也会被视为抽象类,无法实例化。
3.3 抽象工厂模式
3.3.1 特点
- 抽象工厂定义了多个产品族的创建接口,每个产品族通常包含多个相关的产品对象。
- 具体的工厂类实现抽象工厂的接口,负责创建属于特定产品族的产品对象。
- 客户端通过抽象工厂的接口来获取产品族中的对象,而不关心具体的产品类和创建细节。
3.3.2 优点
- 易于交换产品系列:当需要切换到不同的产品系列时,只需要更改使用的具体工厂类。
- 有利于产品的一致性:确保属于同一个产品族的对象能够相互配合和协作。
- 解耦了客户端与具体产品类的创建逻辑。
3.3.3 示例代码
在下述示例中:
- 我们定义了抽象产品 Chair 和 Table ,以及它们的具体实现 ModernChair、ModernTable、ClassicChair 和 ClassicTable 。
- FurnitureFactory 是抽象工厂,定义了创建椅子和桌子的抽象方法。
- ModernFurnitureFactory 和 ClassicFurnitureFactory 是具体的工厂,分别负责创建现代风格和古典风格的家具产品。
- 客户端可以根据需要选择不同的工厂来获取相应风格的家具产品。
from abc import ABC, abstractmethod# 抽象产品 - 椅子
class Chair(ABC):@abstractmethoddef sit(self):pass# 抽象产品 - 桌子
class Table(ABC):@abstractmethoddef put_stuff(self):pass# 具体产品 - 现代风格椅子
class ModernChair(Chair):def sit(self):print("Sitting on a modern chair")# 具体产品 - 现代风格桌子
class ModernTable(Table):def put_stuff(self):print("Putting stuff on a modern table")# 具体产品 - 古典风格椅子
class ClassicChair(Chair):def sit(self):print("Sitting on a classic chair")# 具体产品 - 古典风格桌子
class ClassicTable(Table):def put_stuff(self):print("Putting stuff on a classic table")# 抽象工厂
class FurnitureFactory(ABC):@abstractmethoddef create_chair(self):pass@abstractmethoddef create_table(self):pass# 具体工厂 - 现代风格家具工厂
class ModernFurnitureFactory(FurnitureFactory):def create_chair(self):return ModernChair()def create_table(self):return ModernTable()# 具体工厂 - 古典风格家具工厂
class ClassicFurnitureFactory(FurnitureFactory):def create_chair(self):return ClassicChair()def create_table(self):return ClassicTable()# 客户端代码
# 选择现代风格工厂
factory = ModernFurnitureFactory()
chair = factory.create_chair()
table = factory.create_table()chair.sit()
table.put_stuff()# 选择古典风格工厂
factory = ClassicFurnitureFactory()
chair = factory.create_chair()
table = factory.create_table()chair.sit()
table.put_stuff()
4. 责任链模式
4.1.1 特点
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象都有机会处理请求,从而将请求的发送者和接收者解耦。
在责任链模式中,通常会创建一系列的处理对象(节点),每个对象都包含对下一个处理对象的引用,形成一个链。当有请求发送时,它会从链的头部开始依次传递,直到有一个处理对象能够处理该请求为止。
4.2 优点
- 降低了发送者和接收者之间的耦合度,发送者不需要知道请求最终由谁处理。
- 增强了系统的灵活性,可以动态地修改责任链的结构和节点的处理逻辑。
- 实现了请求的发送者和处理者之间的职责分离。
4.3 示例代码
在下述示例中,创建了三个处理者 ConcreteHandler1、ConcreteHandler2 和 ConcreteHandler3,它们形成了一个责任链。根据请求的不同,由相应的处理者进行处理。
import abcclass Handler:def __init__(self, successor=None):self.successor = successor@abc.abstractmethoddef handle_request(self, request):pass # 这个方法通常在具体的子类中实现,如果当前节点不能处理,则传递给下一个节点class ConcreteHandler1(Handler):def handle_request(self, request):if request < 10:print(f"ConcreteHandler1 处理了请求 {request}")elif self.successor:self.successor.handle_request(request)class ConcreteHandler2(Handler):def handle_request(self, request):if 10 <= request < 20:print(f"ConcreteHandler2 处理了请求 {request}")elif self.successor:self.successor.handle_request(request)class ConcreteHandler3(Handler):def handle_request(self, request):if request >= 20:print(f"ConcreteHandler3 处理了请求 {request}")else:print(f"没有合适的处理者来处理请求 {request}")# 创建责任链
handler1 = ConcreteHandler1()
handler2 = ConcreteHandler2()
handler3 = ConcreteHandler3()handler1.successor = handler2
handler2.successor = handler3# 发送请求
handler1.handle_request(5) # ConcreteHandler1 处理了请求 5
handler1.handle_request(15) # ConcreteHandler2 处理了请求 15
handler1.handle_request(25) # ConcreteHandler3 处理了请求 25
相关文章:
【新人系列】Python 入门(二十六):常见设计模式
✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html 📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们…...
【跟着官网学技术系列之MySQL】第7天之创建和使用数据库1
前言 在当今信息爆炸的时代,拥有信息检索的能力很重要。 作为一名软件工程师,遇到问题,你会怎么办?带着问题去搜索引擎寻找答案?亦或是去技术官网,技术社区去寻找? 根据个人经验,一…...
Spark任务提交流程
当包含在application master中的spark-driver启动后,会与资源调度平台交互获取其他执行器资源,并通过反向注册通知对应的node节点启动执行容器。此外,还会根据程序的执行规划生成两个非常重要的东西,一个是根据spark任务执行计划生…...
使用python+pytest+requests完成自动化接口测试(包括html报告的生成和日志记录以及层级的封装(包括调用Json文件))
一、API的选择 我们进行接口测试需要API文档和系统,我们选择JSONPlaceholder免费API,因为它是一个非常适合进行接口测试、API 测试和学习的工具。它免费、易于使用、无需认证,能够快速帮助开发者模拟常见的接口操作(增、删、改、…...
Docker的入门
一、安装Docker 本教程参考官网文档,链接如下: CentOS | Docker Docs 这个教程是基于你的虚拟机已经弄好了(虚拟机用的CentOS),并且有SecureCRT或者MobaXterm等等任意一个工具 1.1 卸载旧版 如果系统中存在旧版本的Docker&a…...
机器学习:监督学习与非监督学习
监督学习是利用带有标签的数据进行训练,模型通过学习输入和输出之间的关系来进行预测。也就是说,数据集中既有输入特征,也有对应的输出标签,模型的目标是找到从输入到输出的映射关系。 而无监督学习则使用没有标签的数据进行训练,模型的任务是发现数据中的内在结构或模式…...
神经网络常见操作(卷积)输入输出
卷积 dimd的tensor可以进行torch.nn.Convnd(in_channels,out_channels),其中nd-1,d-2对于torch.nn.Convnd(in_channels,out_channels),改变的是tensor的倒数n1维的大小 全连接 使用torch.nn.Linear(in_features,out_features,bias)实现YXWT b,其中X 的形状为 (ba…...
海云安开发者安全智能助手D10荣膺 “ AI标杆产品 ” 称号,首席科学家齐大伟博士入选2024年度 “ 十大杰出青年 ”
2024年12月27日,粤港澳大湾区AI领袖峰会在深圳成功举办,大会表彰了在人工智能技术创新、应用实践和产业发展等方面取得优异成绩的企业和个人,深圳海云安网络安全技术有限公司开发者安全智能助手D10荣膺“AI标杆产品”称号。同时,公…...
O2O同城系统架构与功能分析
2015工作至今,10年资深全栈工程师,CTO,擅长带团队、攻克各种技术难题、研发各类软件产品,我的代码态度:代码虐我千百遍,我待代码如初恋,我的工作态度:极致,责任ÿ…...
C#,入门教程(27)——应用程序(Application)的基础知识
上一篇: C#,入门教程(26)——数据的基本概念与使用方法https://blog.csdn.net/beijinghorn/article/details/124952589 一、什么是应用程序 Application? 应用程序是编程的结果。一般把代码经过编译(等)过程&#…...
计算机网络(四)——网络层
目录 一、功能 二、IP数据报分片 三、DHCP动态主机配置协议 四、网络地址转换(NAT)技术 五、无分类编址CIDR 六、ARP地址解析协议 七、ICMP网际控制报文协议 八、IPv4和IPv6的区别 九、IPv4向IPv6的两种过渡技术——双栈协议和隧道技术 十、路由…...
VSCode的配置与使用(C/C++)
从0开始教你在vscode调试一个C文件 一.首先是配置你的编译环境,添加到环境变量(默认你是全新的电脑,没有安装vs2019之类的) 原因:因为相比于vs2019,vscode只是个代码编辑器,相当于一个彩色的、…...
《机器学习》——TF-IDF(关键词提取)
文章目录 TF-IDF简介TF-IDF应用场景TF-IDF模型模型参数主要参数 TF-IDF实例实例步骤导入数据和模块处理数据处理文章开头和分卷处理将各卷内容存储到数据帧jieba分词和去停用词处理 计算 TF-IDF 并找出核心关键词 TF-IDF简介 TF - IDF(Term Frequency - Inverse Do…...
金仓Kingbase客户端KStudio报OOM:Java heap space socketTimeout
找到Kingbase\ES\V8\KESRealPro\V008R006C006B0021\ClientTools\guitools\KStudio\KStudio.ini 修改JVM参数: 默认值: -Xms512m -Xmx1024m 改为: -Xms1024m -Xmx2048m -XX:MaxPermSize512m SQL查询报错:An I/O error occurred …...
XML在线格式化 - 加菲工具
XML在线格式化 打开网站 加菲工具 选择“XML 在线格式化” 输入XML,点击左上角的“格式化”按钮 得到格式化后的结果...
thinkphp8.0 likeadmin 框架添加API 文档自动生成工具 apidoc支持
Apidoc 是一个便捷的 API 文档自动生成工具,它能帮助开发者快速生成和管理 API 文档。以下是 Apidoc 的主要特点和功能: 主要特点 开箱即用 安装后,无需繁杂配置,直接按照文档编写注释,即可自动生成 API 文档。 轻松编…...
计算机网络 (44)电子邮件
一、概述 电子邮件(Electronic Mail,简称E-mail)是因特网上最早流行的应用之一,并且至今仍然是因特网上最重要、最实用的应用之一。它利用计算机技术和互联网,实现了信息的快速、便捷传递。与传统的邮政系统相比&#…...
【Idea启动项目报错NegativeArraySizeException】
项目场景: Idea启动项目报错(打包不报错),项目在服务器部署运行没有问题,尝试了重启idea、重启电脑、maven clean/install 都不行 maven-resources-production:sample: java.lang.NegativeArraySizeException: -5833…...
长安“战疫”网络安全公益赛的一些随想
起因 今年刚进入大学,开始带校队,为了培养校队新成员,也就一直计划着和当地的一些高校合作交流,但是由于种种原因一直被搁置下来。正巧学校信息中心和四叶草有一个培训项目的合作,学校的网安协会也算是沾了光成为了培…...
【网络编程】基础知识
目录 网络发展史 局域网和广域网 局域网(LAN) 广域网(Wan) 光猫 路由器 网线 设备通信的要素 IP地址 基本概念 地址划分 特殊地址(后续编程使用) IP地址转换 字节序 网络模型 网络的体系结…...
RK3568平台(音频篇)lineout无声调试
一.声音硬件框架 硬件HP_MUTE已强制拉低。 二.设备树配置 es8388_sound: es8388-sound {status = "okay";compatible = "rockchip,multicodecs-card";rockchip,card-name = "rockchip-es8388";hp-det-gpio = <&gpio1 RK_PD2 GPIO_ACT…...
计算机组成原理(计算机系统3)--实验三:取指和指令译码设计
一、 实验目标: 设计完成一个连续取指令并进行指令译码的电路,从而掌握设计简单数据通路的基本方法。 二、实验内容 本实验完成:1)首先完成一个译码器;2)接着实现一个寄存器文件;3࿰…...
紫光无人机AI飞控平台介绍
随着无人机技术的迅猛发展,无人机飞控平台的智能化需求不断提升。紫光无人机AI飞控平台作为一款创新型产品,为用户提供了从飞行控制到任务管理的一站式解决方案,尤其在AI实时识别和事件分析方面具有显著优势。本文将介绍平台的核心功能、技术…...
基于EMQX+MQTT+ESP32+Openharmony的开发实例
EMQX介绍 EMQ X 是基于 Erlang/OTP 平台开发的 MQTT 消息服务器,是开源社区中最流行的 MQTT 消息服务器。EMQX 是开源百万级分布式 MQTT 消息服务器(MQTT Messaging Broker),用于支持各种接入标准 MQTT 协议的设备,实…...
npm发布组件(vue3+webpack)
1.初始化Vue项目 vue create my-app 2.本地运行 npm run serve 3.新增目录和文件 1. src/package/index.js 2. src/package/wlz-btn/index.vue 3. src/package/wlz-input/index.vue // src\package\index.js import WlzBtn from "./wlz-btn"; import WlzInput …...
kubuntu24.04配置vmware17.5.1
背景 个人主机的最后一次折腾吧。 丝滑上网前提:singbox实践https://blog.csdn.net/qq_43652666/article/details/145190110 vmware 博通官网下载vmware workstation pro 17.5.1版本,注意一个新注册的账号只能下载一个win版本的vmware和一个linux版本…...
开发规范
开发规范 企业项目开发有2种开发模式:前后台混合开发和前后台分离开发。 前后台混合开发 顾名思义就是前台后台代码混在一起开发,如下图所示: 这种开发模式有如下缺点: 沟通成本高:后台人员发现前端有问题…...
大模型UI:Gradio全解11——Chatbot:融合大模型的聊天机器人(4)
大模型UI:Gradio全解11——Chatbot:融合大模型的聊天机器人(4) 前言本篇摘要11. Chatbot:融合大模型的多模态聊天机器人11.4 使用Blocks创建自定义聊天机器人11.4.1 简单聊天机器人演示11.4.2 流式传输Chatbot11.4.3 添…...
[操作系统] 深入理解操作系统的概念及定位
概念 任何计算机系统都包含⼀个基本的程序集合,称为操作系统(OS)。 其核心功能如图片所示,包括: 内核 (Kernel): 内核是操作系统的核心部分,被认为是狭义上的操作系统,直接与硬件打交道。负责进程管理、内…...
redhat安装docker 24.0.7
1、下载docker镜像包 wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.7.tgz 2、解压 tar -xvf docker-24.0.7.tgz 3、解压的docker文件夹全部移动至/usr/bin目录 cd docker cp -p docker/* /usr/bin 4、注册服务 vi /usr/lib/systemd/syste…...
数据库基础实验1(创建表,设置外键,检查,不为空,主键等约束)安装mysql详细步骤
安装MySQL详细步骤 1. 下载 MySQL 安装程序 访问 MySQL 官方网站:MySQL Downloads。在下载页面,选择 "MySQL Community (GPL) Downloads"。在 "MySQL Community Server" 部分,根据你的操作系统(Windows&…...
如何攻击一个服务器(仅用于教育及娱乐实验目的)
import socket import osdef create_virus():# 创建一个简单的病毒脚本,它会不断尝试连接目标服务器并发送恶意数据virus_code """ import socket import time import threadingdef attack_server(ip, port):while True:try:s socket.socket(socke…...
HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (二、首页轮播图懒加载的实现)
在开发一款影视APP时,首页的轮播图是一个非常重要的部分。它不仅能够吸引用户的注意力,还能有效地推广重点内容。为了提升应用的性能和用户体验,可以实现轮播图的懒加载功能。本文将详细介绍如何在HarmonyOS NEXT应用开发中实现这一功能。 1.…...
Jmeter 简单使用、生成测试报告(一)
一、下载Jmter 去官网下载,我下载的是apache-jmeter-5.6.3.zip,解压后就能用。 二、安装java环境 JMeter是基于Java开发的,运行JMeter需要Java环境。 1.下载JDK、安装Jdk 2.配置java环境变量 3.验证安装是否成功(java -versio…...
采用海豚调度器+Doris开发数仓保姆级教程(满满是踩坑干货细节,持续更新)
目录 一、采用海豚调度器+Doris开发平替CDH Hdfs + Yarn + Hive + Oozie的理由。 1. 架构复杂性 2. 数据处理性能 3. 数据同步与更新 4. 资源利用率与成本 6. 生态系统与兼容性 7. 符合信创或国产化要求 二、ODS层接入数据 接入kafka实时数据 踩坑的问题细节 三、海…...
大疆最新款无人机发布,可照亮百米之外目标
近日,DJI 大疆发布全新小型智能多光旗舰 DJI Matrice 4 系列,包含 Matrice 4T 和 Matrice 4E 两款机型。DJI Matrice 4E 价格为27888 元起,DJI Matrice 4T价格为38888元起。 图片来源:大疆官网 DJI Matrice 4E DJI Matrice 4T D…...
无公网IP 实现外网访问本地 Docker 部署 Navidrome
Navidrome 是一款可以在 macOS、Linux、Windows以及 Docker 等平台上运行的跨平台开源音乐服务器应用,它支持传输常见的 MP3、FLAC、WAV等音频格式。允许用户通过 Web 界面或 API 进行音乐库的管理和访问。本文就介绍如何快速在 Linux 系统使用 Docker 进行本地部署…...
踏上 C++ 编程之旅:开篇之作
踏上 C 编程之旅:开篇之作 在计算机编程的广袤天地中,C 宛如一座巍峨的高峰,吸引着无数开发者攀登探索。今天,就让我们一同开启这段充满挑战与惊喜的 C 编程之旅,在代码的世界里开辟属于自己的道路。 一、为什么选择…...
JS逆向系列之某考古站数据解密
声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请私信我立即删除! 文章目录 声明本次目标网址逆向分析ing代码python实现最近太忙了,博客摆烂了好久,狗头保命.jpg。 本次目标网址 aHR0cHM6Ly93d3cua2F…...
idea 如何安装 github copilot
idea 如何安装 github copilot 要在 IntelliJ IDEA 中安装 GitHub Copilot,可以按照以下步骤操作: 打开 IntelliJ IDEA: 启动 IntelliJ IDEA。 打开插件管理器: 点击菜单栏中的 File。 选择 Settings(Windows/Linux)或 Prefere…...
html5各行各业官网模板源码下载 (4)
文章目录 1.来源2.源码模板2.1 html实现酷炫美观的可视化大屏(十种风格示例,附源码)2.2 HTML5实现古典音乐网站源码模板22.3 HTML5实现古典音乐网站源码模板32.4 HTML5实现小鸟过管道小游戏源码2.5 HTML5实现俄罗斯方块小游戏2.5 HTML5实现剪刀石头布小游戏(附源码)…...
2023-2024 学年 广东省职业院校技能大赛(高职组)“信息安全管理与评估”赛题一
2023-2024 学年 广东省职业院校技能大赛(高职组“信息安全管理与评估”赛题一) 模块一:网络平台搭建与设备安全防护第一阶段任务书任务 1:网络平台搭建任务 2:网络安全设备配置与防护DCRS:DCFW:DCWS:DCBC:WAF: 模块二:网络安全事件…...
理解CPU负载与使用率
目录 CPU使用率 CPU负载 CPU使用率 定义:就像看一个工人干活的时间占他上班时间的比例。比如工人上班8小时,实际干活6小时,干活时间占比就是68100%75%。对于CPU,单核的看它被占用的时间占总时间的比例,多核的就把每个…...
鸿蒙-点击Notification通知并打开App的具体页面
意图通知 获取router事件中传递参数并跳转 目前点击通知消息打开应用的指定页面,通过为通知添加行为意图的方式。也就是在wants的parameters中设置自定义参数,然后在UIAbility的onNewWant或者onCreate方法中 解析配置的自定义参数信息判断跳转不同页面&a…...
Jmeter分布式测试的注意事项和常见问题
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 Jmeter是一款开源的性能测试工具,使用Jmeter进行分布式测试时,也需要注意一些细节和问题,否则可能会影响测试结果的准确性和可靠…...
w~Transformer~合集11
我自己的原文哦~ https://blog.51cto.com/whaosoft/12472192 #LightSeq 最高加速9倍!字节跳动开源8比特混合精度Transformer引擎,近年来,Transformer 已经成为了 NLP 和 CV 等领域的主流模型,但庞大的模型参数限制了它的高效训练和推理。…...
YOLOv10-1.1部分代码阅读笔记-build.py
build.py ultralytics\data\build.py 目录 build.py 1.所需的库和模块 2.class InfiniteDataLoader(dataloader.DataLoader): 3.class _RepeatSampler: 4.def seed_worker(worker_id): 5.def build_yolo_dataset(cfg, img_path, batch, data, mode"train"…...
c++ 中的容器 vector、deque 和 list 的区别
表格汇总: 容器存储结构随机访问性能中间插入/删除性能两端插入/删除性能内存管理特点迭代器类型适用场景vector连续存储的动态数组 O ( 1 ) O(1) O(1) O ( n ) O(n) O(n)(需要移动元素)末尾: O ( 1 ) O(1) O(1),头部…...
如何有效学习PyTorch:从基础到实践的全面指南
随着人工智能和深度学习技术的飞速发展,PyTorch作为当前最流行的深度学习框架之一,凭借其动态计算图、灵活的编程模型以及强大的社区支持,在学术界和工业界均得到了广泛应用。本文旨在为初学者和有一定基础的读者提供一套系统、全面的PyTorch…...
大模型WebUI:Gradio全解11——Chatbots:融合大模型的多模态聊天机器人(3)
大模型WebUI:Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(3) 前言本篇摘要11. Chatbot:融合大模型的多模态聊天机器人11.3 组件Chatbot及ChatMessage11.3.1 Chatbot:聊天机器人组件1. API参数2.…...