Python异常处理与OOP深度解析及实战案例
**导读:**在现代软件开发中,异常处理与面向对象编程(OOP)是构建健壮、可维护程序的两大基石。本文深入解析了 Python 中的异常处理机制和 OOP 编程的核心概念,并通过实战案例帮助你掌握这些技术的实际应用。
文章从异常处理的基础语法入手,详细讲解了try-except
的使用场景及常见异常类型,如ZeroDivisionError
和FileNotFoundError
。同时,还介绍了自定义异常类的设计方法以及如何利用异常链优化复杂系统的错误处理逻辑。此外,针对性能影响和最佳实践,文章提供了宝贵的建议,例如避免裸except
捕获所有异常。
在 OOP 部分,文章系统梳理了类的基本结构、属性与方法的区别,并通过一个完整的学生管理系统案例展示了封装、继承和多态的应用。特别是对抽象类与抽象方法的讲解,为实现接口规范化的编程提供了清晰的指导。
如果你曾困惑于如何优雅地处理运行时错误,或者想深入了解 Python 中 OOP 的精髓,这篇文章将为你提供全面的知识体系与实用技巧。例如,为什么类属性更适合用作全局配置?如何通过super()
实现子类对父类方法的扩展?这些问题的答案都在文中等待你的探索。
继续阅读全文,你将收获一套完整的 Python 异常处理与 OOP 编程工具箱,助力你的开发工作更加高效和专业!
引言
在现代软件开发中,异常处理和面向对象编程(OOP)是两个核心概念。它们不仅帮助开发者构建更健壮的程序,还提供了强大的代码复用和扩展能力。本文将深入探讨 Python 中的异常处理机制和 OOP 编程的核心概念,并通过具体案例分析其应用场景和实现细节。
第一部分:Python 异常处理详解
1.1 为什么需要异常处理?
异常处理是确保程序在运行时能够优雅地应对错误的关键手段。以下是它的几个主要作用:
- 提升程序健壮性:避免因未捕获的错误导致程序崩溃。
- 提供友好提示:将复杂的技术错误信息转化为用户可理解的内容。
- 资源管理:确保文件、网络连接等资源在异常情况下也能正确释放。
1.2 基本语法
Python 的异常处理使用 try-except
结构,基本形式如下:
try:# 可能引发异常的代码块
except 异常类型1:# 处理异常类型1的代码块
except 异常类型2 as e:# 处理异常类型2并获取异常对象e的代码块
else:# 未发生异常时执行的代码块
finally:# 无论是否有异常,最后都会执行的代码块(如资源清理)
1.3 常见异常类型及其触发场景
异常类型 | 触发场景 | 示例代码 |
---|---|---|
ZeroDivisionError | 除以零 | 10 / 0 |
FileNotFoundError | 文件不存在 | open("missing.txt") |
ValueError | 类型转换失败 | int("abc") |
IndexError | 索引越界 | lst = [1]; lst[2] |
KeyError | 字典键不存在 | d = {"a": 1}; d["b"] |
TypeError | 操作类型不匹配 | 'a' + 1 |
1.4 实战案例
基础异常捕获
以下是一个简单的异常捕获示例,展示了如何处理用户输入的常见问题:
try:num = int(input("请输入一个数字: "))result = 100 / numprint(result)
except ValueError:print("请输入数字!")
except ZeroDivisionError:print("除数不能为0!")
except Exception as e:print("未知错误", e)
else:print("没有异常发生!")
finally:print("无论是否发生异常,都会执行!")
捕获多个异常
在某些情况下,可能需要同时捕获多种异常类型。例如,在文件操作中:
try:with open("data.txt", "r") as f:f.read()
except (FileNotFoundError, PermissionError) as e:print(f"文件操作失败: {e}")
自定义异常类
除了内置异常类型,我们还可以根据需求定义自己的异常类。例如,验证年龄的有效性:
class InvalidAgeError(Exception):"""年龄无效异常"""def __init__(self, age):self.age = agesuper().__init__(f"年龄(age)无效,必须大于0!")def set_age(age):if age <= 0:raise InvalidAgeError(age)print("年龄设置成功:", age)# 测试:
try:set_age(-5)
except InvalidAgeError as ei:print(ei) # 输出:年龄-5无效,必须大于0!
1.5 技术深度解析
- 异常链:在复杂的系统中,异常可能会被多次捕获和重新抛出。使用
raise from
可以保留原始异常信息。 - 性能影响:频繁的异常抛出会降低程序性能,因此应尽量减少不必要的异常触发。
- 最佳实践:仅捕获已知的异常类型,避免使用裸
except
来捕获所有异常。
第二部分:Python 面向对象编程(OOP)
2.1 OOP 的基本概念
面向对象编程是一种以对象为中心的编程范式,它通过封装、继承和多态来组织代码结构。Python 是一种支持 OOP 的语言,其核心概念包括:
- 类(Class):定义对象的蓝图。
- 实例(Instance):类的具体实现。
- 属性(Attribute):描述对象的状态。
- 方法(Method):定义对象的行为。
2.2 类的基本结构
class 类名:"""类文档字符串"""# 定义类属性name = "muller"# 定义私有属性__weight = 0def __init__(self, 参数1, 参数2): # 构造方法self.实例属性1 = 参数1self.实例属性2 = 参数2def 实例方法(self):"""方法文档字符串"""return self.实例属性1@classmethoddef 类方法(cls):return cls.类属性@staticmethoddef 静态方法():return "与类和实例无关"
2.3 类属性 vs 实例属性
特征 | 类属性 | 实例属性 |
---|---|---|
存储位置 | 类内部定义,类自身维护 | __init__ 中定义,实例独立存储 |
共享性 | 所有实例共享同一份值 | 每个实例拥有独立副本 |
修改影响 | 修改后,所有实例访问到新值 | 修改仅影响当前实例 |
内存占用 | 全类共用1份内存 | 每个实例单独占用内存 |
典型用途 | 常量、计数器、全局配置 | 对象个性化数据 |
2.4 方法类型对比
方法类型 | 装饰器 | 第一个参数 | 访问权限 | 典型应用场景 |
---|---|---|---|---|
实例方法 | 无 | self | 实例属性和类属性 | 对象的具体行为实现 |
类方法 | @classmethod | cls | 只能访问类属性 | 工厂方法、操作类属性 |
静态方法 | @staticmethod | 无 | 不能访问实例和类属性 | 工具函数、与类相关的计算 |
2.5 综合案例:学生管理系统
以下是一个完整的学生管理系统案例,展示了类的封装、私有属性和魔术方法的应用:
class StudentManager:__students = [] # 私有类属性def __init__(self, name):self.manager_name = namedef add_student(self, student):self.__students.append(student)print(f"{student} 已添加")@classmethoddef get_student_count(cls):return len(cls.__students)@staticmethoddef validate_age(age):return 15 <= age <= 60def __str__(self):return f"管理员: {self.manager_name}, 管理学生数: {len(self.__students)}"class Student:def __init__(self, name, age):if not StudentManager.validate_age(age):raise ValueError("无效年龄")self.name = nameself.age = agedef __repr__(self):return f"<Student {self.name}>"mgr = StudentManager("王老师")
try:s1 = Student("张三", 18)mgr.add_student(s1) # <Student 张三> 已添加s2 = Student("李四", 12) # ValueError: 无效年龄
except ValueError as e:print(e)print(mgr) # 管理员:王老师, 管理学生数:1
print(StudentManager.get_student_count()) # 1
第三部分:继承与抽象方法
3.1 继承的基本概念
继承是 OOP 的核心特性之一,它允许子类继承父类的属性和方法,并在此基础上进行扩展或修改。
- 代码复用:子类自动获得父类非私有属性和方法。
- 扩展性:子类可以添加新的属性和方法。
- 多态基础:不同子类对同一方法的不同实现。
3.2 方法重写
方法重写分为两种主要形式:
- 完全重写:子类完全覆盖父类的方法。
- 扩展式重写(使用
super()
):在子类方法中调用父类方法,然后进行额外处理。
示例:扩展式重写
class Phone:def __init__(self, brand):self.brand = branddef call(self, number):print(f"{self.brand}手机拨打: {number}")class SmartPhone(Phone):def __init__(self, brand, os):super().__init__(brand) # 调用父类构造self.os = osdef call(self, number):super().call(number) # 重用父类方法print("正在使用网络通话功能")sp = SmartPhone("华为", "HarmonyOS")
sp.call("13800138000")
3.3 抽象类与抽象方法
抽象基类(Abstract Base Class, ABC)是一种不能被实例化的类,主要用于定义接口。抽象方法只有方法签名,没有具体实现,子类必须实现这些方法。
from abc import ABC, abstractmethodclass Shape(ABC):@abstractmethoddef area(self):pass@abstractmethoddef perimeter(self):passclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius ** 2def perimeter(self):return 2 * 3.14 * self.radiusc = Circle(5)
print(c.area()) # 78.5
总结与展望
本文全面介绍了 Python 中的异常处理和面向对象编程(OOP)的核心概念与实战技巧。通过具体的案例分析,我们不仅了解了异常处理的重要性,还掌握了 OOP 编程中的类、继承和抽象方法的使用方法。
未来,随着人工智能和大数据的发展,Python 的 OOP 编程将在更多领域发挥重要作用。希望本文能为你的学习和实践提供有价值的参考!
相关文章:
Python异常处理与OOP深度解析及实战案例
**导读:**在现代软件开发中,异常处理与面向对象编程(OOP)是构建健壮、可维护程序的两大基石。本文深入解析了 Python 中的异常处理机制和 OOP 编程的核心概念,并通过实战案例帮助你掌握这些技术的实际应用。 文章从异常…...
KnowCard:我的知识卡片生成器是怎么炼成的?
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 起心动念:我想做个“笔记神器” 有时候,看着笔记本里密密麻麻的学习要点,我…...
JAVA EE(进阶)_进阶的开端
别放弃浸透泪水的昨天,晨光已为明天掀开新篇 ——陳長生. ❀主页:陳長生.-CSDN博客❀ 📕上一篇:JAVA EE_HTTP-CSDN博客 1.什么是Java EE Java EE(Java Pla…...
装甲PPT习题
装甲PPT习题 第一章 将 42.195 42.195 42.195, 0.0375551 0.0375551 0.0375551, 8.00033 8.00033 8.00033, 2.71828 2.71828 2.71828 按四舍五入写出上述各数具有四位有效数字的近似数。 考察三位有效数字重力加速度 g g g,若…...
EasyExcel动态表头
专家官方解答 : 在使用EasyExcel处理Excel动态表头的问题时,官方并不推荐使用includecolumnfieldnames方法。根据提供的知识内容,以下是如何实现动态表头的详细步骤和解释: 原因分析 动态表头的需求通常来源于希望根据用户的选…...
LoadBarWorks:一款赛博风加载动画生成器的构建旅程
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 项目缘起:赛博与实用的结合 在日常开发中,我经常需要为不同的项目添加加载动画&#x…...
跨平台多用户环境下PDF表单“序列号生成的服务器端方案“
在PDF表单处理中,经常需要为每个表单生成唯一的序列号或表单编号。当所有表单都在同一台计算机上由同一用户处理时,可以通过JavaScript将编号存储在另一个表单或全局JavaScript数据中来实现。然而,当需要在多台计算机或多个用户环境中使用时&…...
二:操作系统之进程控制块(PCB)
进程的身份证与状态记录:深入理解进程控制块 (PCB) 在我们之前的博客中,我们探讨了进程是什么——程序的一次执行实例,以及进程在其生命周期中会经历的各种状态(新建、就绪、运行、等待、终止)。我们知道,…...
创建型:原型模式
目录 1、核心思想 2、实现方式 2.1 基本结构 2.2 代码示例(Java) 3、适用场景 4、new与clone实际场景建议 1、核心思想 目的:通过复制(克隆)现有对象来创建新对象,而不是通过new关键字实例化。对于那…...
从c++到python
从c到python 前言printprint格式化print按原始格式输出 input变量、常量和数据类型整型和type()浮点型复数字符串类型数据类型转换变量地址 注释关键字容器列表list下标索引常用功能 元组tuple字符串str字符串的成员函数:字符串初始化为几个固定字符字符和int型数据…...
仿腾讯会议——房间界面用户设置
1、房间界面设置 2、 添加新设计师界面类 3、设置用户设置 4、添加新类&&设置房间标题 5、设置控件 6、修改用户展示头文件 7、 设置用户名 8、客户端添加用户展示 9、测试数据 10、成功截图...
Vue+Go 自定义打字素材的打字网站
Typing_Key_Board 这是一个基于Vue 3和Go语言的自定义素材打字练习网站,灵感来源于常用字打字练习,解决了大多数网站无法自定义打字素材的问题。在 Typing_Key_Board (简称TKB)中,用户可以自定义打字素材进行练习,在复习代码的同…...
生产级编排AI工作流套件:Flyte全面使用指南 — Data input/output
生产级编排AI工作流套件:Flyte全面使用指南 — Data input/output Flyte 是一个开源编排器,用于构建生产级数据和机器学习流水线。它以 Kubernetes 作为底层平台,注重可扩展性和可重复性。借助 Flyte,用户团队可以使用 Python SDK…...
JUC入门(二)
5、8锁现象:就是关于锁的八个问题 谁来充当锁?要锁的是什么东西?这个锁有什么用? 其实锁的作用就是:哪个线程先拿到锁,谁就有先执行同步方法的权力 那么谁能充当锁?任何对象都可以充当锁 要…...
深入浅出:CPU寻址方式完全指南(从理论到实践)
引言:为什么需要寻址方式? 当我们写下一行高级语言代码(比如 int sum a b;),计算机底层是如何找到变量 a 和 b 的? 寻址方式(Addressing Modes) 就是 CPU 定位操作数的策略&#…...
PyQt5基本窗口控件(对话框类控件)
对话框类控件 QDialog 为了更好地实现人机交互,比如Windows及Linux等系统均会提供一系列的标 准对话框来完成特定场景下的功能,如选择字号大小、字体颜色等。在PyQt5中定 义了一系列的标准对话框类,让使用者能够方便和快捷地通过各个类完成…...
【PostgreSQL系列】PostgreSQL 复制参数详解
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
给easyui的textbox绑定回车事件
项目有一个textbox输入框,需要绑定一个回车搜索事件。 一开始想着,直接使用js的on或者jquery的keydown方法直接绑定,但是事件不生效。 $("#propName").textbox({width: 200,prompt: "请输入物品名称进行搜索" }).keydo…...
量子计算 | 量子密码学的挑战和机遇
量子计算在密码学中的应用现主要体现在对现有加密算法的威胁上。最著名的例子是Shor算法,该算法能够在多项式时间内分解大整数,从而威胁到基于大数分解的加密算法,如RSA加密。此外,量子计算还可以加速某些类型的密码分析ÿ…...
什么是着色器 Shader
本人就是图形学结课了,对 OpenGL着色器还有很多疑问嘿嘿 文章目录 为什么要有着色器vshaderfshader 本文围绕 vshader 和 fshader 代码示例讲解。 (着色器代码取自本人简单OpenGL项目 https://github.com/DBWGLX/-OpenGL-3D-Lighting-and-Shadow-Modeli…...
STM32H562----------启动时钟分析
1、H562启动过程分析 1.1、启动模式 复位方式有三种:上电复位、硬件复位和软件复位。当产生复位后,离开复位状态后 CM33 内核做的第一件事就是 读取堆栈指针 MSP 的初始值及程序计数器指针 PC 的初始值: 1、从地址 0x0000 0000 处读取出堆栈指针 MSP 的初始值,该值即栈…...
MIT 6.S081 2020 Lab4 traps 个人全流程
零、写在前面 做之前可以看看Chapter 4:Traps and systems calls,了解XV6 下的陷入机制 https://pdos.csail.mit.edu/6.828/2020/xv6/book-riscv-rev1.pdf 这个实验旨在探索系统调用如何实现了trap,会先做一个有关栈的练习,然后…...
基于YOLOv8-OBB的旋转目标检测:从数据制作到自动标注完整指南
一、引言 目标检测作为计算机视觉中的核心任务,广泛应用于安防监控、自动驾驶、工业质检等场景。传统的目标检测方法多使用水平边界框(HBB)进行目标定位。然而在一些特殊应用场景(如遥感图像、文本检测、PCB检测等)中…...
【自然语言处理与大模型】向量数据库:Chroma使用指南
Chroma是一款功能强大的开源 AI 应用数据库,专为高效数据存储与检索而设计。它不仅支持 Embedding 和 Metadata 的存储,还集成了多项核心功能,包括向量搜索、全文搜索、Document 存储、Metadata 过滤以及多模态检索。此外,Chroma …...
一文掌握工业相机选型计算
目录 一、基本概念 1.1 物方和像方 1.2 工作距离和视场 1.3 放大倍率 1.4 相机芯片尺寸 二、公式计算 三、实例应用 一、基本概念 1.1 物方和像方 在光学领域,物方(Object Space)是与像方(Image Space)相对的…...
【周输入】510周阅读推荐-3
前文 【周输入】510周阅读推荐-1-CSDN博客 【周输入】510周阅读推荐-2-CSDN博客 本次推荐 目录 前文 本次推荐 算法技术 模型产品 算法技术 vLLM和DeepSpeed部署模型的优缺点_vllm deepspeed-CSDN博客 优点缺点总结vLLM 适用于推理 优化内存管理 高效并行化 功能单…...
机器学习(11)——xgboost
文章目录 1. 算法背景和动机1.1. 提升算法(Boosting)1.2. XGBoost的改进动机2. 算法基础 3. 核心创新3.4 稀疏感知算法 4. 系统优化4.1 列块(Column Block)4.2 缓存感知访问4.3 外存计算 5. 算法细节5.1 树生长策略5.2 特征重要性评估5.3 自定义目标函数…...
大语言模型上下文长度:发展历程、局限与技术突破
1. 引言:什么是上下文长度及其重要性 上下文长度(Context Length),也称为上下文窗口(Context Window),指的是大语言模型(LLM)在处理和生成文本时能够有效记忆和利用的信…...
ControlNet简洁
ControlNet 什么是ControlNet ControlNet是一种用于控制扩散模型生成结果的网络结构。该结构可以将边缘图,结构图等信息注入扩散模型,从而能够对生成结果进行更为精细的控制。 ControlNet是怎么实现的 在模型结构方面,其大致结构如下图所…...
【C】C程序内存分配
文章目录 1. C程序内存布局 1. C程序内存布局 从低地址到高地址依次为: 代码段 存储内容:存放编译后的机器指令特点:代码段是只读的;可共享,多个进程可共享同一份代码 数据段 存储内容 已初始化的全局变量已初始化的静…...
论文学习:《引入TEC - LncMir,通过对RNA序列的深度学习来预测lncRNA - miRNA的相互作用》
长链非编码RNA ( long noncoding RNAs,lncRNAs )是一类长度通常大于200个核糖核苷酸的非编码RNA ,微小RNA ( microRNAs,miRNAs )是一类由22个核糖核苷酸组成的短链非编码RNA。近年来,越来越多的研究表明,lncRNA和miRNA…...
【每日一题丨2025年5.12~5.18】排序相关题
个人主页:Guiat 归属专栏:每日一题 文章目录 1. 【5.12】P1068 [NOIP 2009 普及组] 分数线划定2. 【5.13】P5143 攀爬者3. 【5.14】P12366 [蓝桥杯 2022 省 Python B] 数位排序4. 【5.15】P10901 [蓝桥杯 2024 省 C] 封闭图形个数5.【5.16】P12165 [蓝桥…...
AIDA64 extreme7.5 版本注册激活方法
一、AIDA 7.5 序列号 3BQN1-FUYD6-4GDT1-MDPUY-TLCT7 UVLNY-K3PDB-6IDJ6-CD8LY-NMVZM 4PIID-N3HDB-IWDJI-6DMWY-9EZVU 二、安装激活方法 激活步骤: 1、打开AIDA64软件,点击顶部菜单栏的“帮助”→“输入序列号” 2、将生成的序列号粘贴至输入框&a…...
Python 条件语句详解
条件语句是编程中用于控制程序流程的基本结构,Python 提供了几种条件语句来实现不同的逻辑判断。 1. if 语句 最基本的条件语句形式: if 条件:# 条件为真时执行的代码块示例: age 18 if age > 18:print("你已经成年了")2. …...
模型评估与调优(PyTorch)
文章目录 模型评估方法混淆矩阵混淆矩阵中的指标ROC曲线(受试者工作特征)AUCR平方残差均方误差(MSE)均方根误差(RMSE)平均绝对误差(MAE) 模型调优方法交叉验证(CV&#x…...
oppo手机安装APK失败报错:安装包异常
如果你的apk文件在oppo手机安装失败了,像这样: 先说我们当时解决方式: 如果还没上架应用市场的测试包,在上面图一中需要关闭“超级守护”,类似华为的纯净模式。如果开启了还还不行,安装页面的报错太笼统不…...
互联网大厂Java面试场景:从缓存到容器化的技术问答
场景:互联网大厂Java面试之旅 面试官:严肃的技术专家 应聘者:搞笑的水货程序员明哥 第一轮:缓存技术与数据库优化 面试官:明哥,你能谈谈Redis的常见使用场景和一些优化技巧吗? 明哥…...
【android bluetooth 协议分析 01】【HCI 层介绍 6】【WriteLeHostSupport命令介绍】
HCI 指令 HCI_Write_LE_Host_Support 是 Bluetooth Host 向 Controller 发送的一条指令,用于启用或禁用主机对 Bluetooth Low Energy(LE)的支持能力。该指令属于 HCI(Host Controller Interface)命令集合中,…...
Helm配置之为特定Deployment配置特定Docker仓库(覆盖全局配置)
文章目录 Helm配置之为特定Deployment配置特定Docker仓库(覆盖全局配置)需求方法1:使用Helm覆盖值方法2: 在Lens中临时修改Deployment配置步骤 1: 创建 Docker Registry Secret步骤 2: 在 Deployment 中引用 Secret参考资料Helm配置之为特定Deployment配置特定Docker仓库(覆…...
项目:在线音乐播放服务器——基于SSM框架和mybatis
介绍项目 项目主要是基于SSM框架和mybatis进行实现 主要的功能: 登陆界面,用户注册,音乐的播放列表,删除指定的歌曲,批量删除指定的歌曲,收藏歌曲,查询歌曲,从收藏列表中删除收藏…...
Linux配置vimplus
配置vimplus CentOS的配置方案很简单,但是Ubuntu的解决方案网上也很多但是有效的很少,尤其是22和24的解决方案,在此我整理了一下我遇到的问题解决方法 CentOS7 一键配置VimForCPP 基本上不会有什么特别难解决的报错 sudo yum install vims…...
Ubuntu22.04开机运行程序
新建启动文件 sudo vim /etc/systemd/system/trojan.service 2. 写入配置文件 [Unit] DescriptionTrojan Proxy Service Afternetwork.target[Service] Typesimple ExecStart/home/cui/Downloads/trojan/trojan -c /home/cui/Downloads/trojan/config.json Restarton-failur…...
高效查询:位图、B+树
1. 位图(BitMap)与布隆过滤器(Bloom Filter) 1.1. 问题背景与解决方案 问题背景 场景:网页爬虫判重 搜索引擎的爬虫会不断地解析网页中的链接并继续爬取。一个网页可能在多个页面中出现,容易重复爬取。…...
HashMap的扩容机制
在添加元素或初始化的时候需要调用resize方法进行扩容,第一次添加数据初始化数组长度为16,以后每次每次扩容都是达到了扩容阈值(数组长度 * 0.75) 每次扩容的时候,都是扩容之前容量的2倍; 扩容之后&#…...
从坏道扫描到错误修复:HD Tune实战指南
一、硬盘检测的必要性 随着计算机使用时间的增加,机械硬盘和固态硬盘都会出现不同程度的性能衰减。定期进行硬盘健康检查可以:及时发现潜在故障;预防数据丢失风险;掌握存储设备实际状态。 二、HD Tune功能解析 性能测试&#x…...
Leetcode 3553. Minimum Weighted Subgraph With the Required Paths II
Leetcode 3553. Minimum Weighted Subgraph With the Required Paths II 1. 解题思路2. 代码实现 题目链接:3553. Minimum Weighted Subgraph With the Required Paths II 1. 解题思路 这一题很惭愧,并没有自力搞定,是看了大佬们的解答才有…...
算法加训之最短路 上(dijkstra算法)
目录 P4779 【模板】单源最短路径(标准版)(洛谷) 思路 743. 网络延迟时间(力扣) 思路 1514.概率最大路径(力扣) 思路 1631.最小体力消耗路径 思路 1976. 到达目的地的方案数 …...
01 Nginx安装及基本配置
01 Nginx安装 # 官网:https://nginx.org/en/ # 点击下载图1 Nginx下载官网 # https://nginx.org/en/download.html # 全是各个平台的源码包图2 Nginx下载版本 # 找到最下面的stable and mainline(稳定版和主线版)图3 找到最下面的稳定版 # https://nginx.org/en/li…...
ABP vNext 多租户系统实现登录页自定义 Logo 的最佳实践
🚀 ABP vNext 多租户系统实现登录页自定义 Logo 的最佳实践 🧭 版本信息与运行环境 ABP Framework:v8.1.5.NET SDK:8.0数据库:PostgreSQL(支持 SQLServer、MySQL 等)BLOB 存储:本地…...
Docker 网络
目录 前言 1. Docker 网络模式 2. 默认 bridge 网络详解 (1)特点 (2)操作示例 3. host 网络模式 (1)特点 (2)操作示例 4. overlay…...