深度剖析:Pytest Fixtures如何重塑自动化测试的可读性与高效性
关注开源优测不迷路
大数据测试过程、策略及挑战
测试框架原理,构建成功的基石
在自动化测试工作之前,你应该知道的10条建议
在自动化测试中,重要的不是工具
在编写单元测试时,是否发现自己写了很多相同/相似代码呢?
像数据库的设置与清理、API客户端或测试数据这类单调乏味的代码,如果要在几十甚至几百个单元测试中重复编写,会非常痛苦。
在编写测试时,通常需要在运行实际的测试代码之前设置一些初始状态。
编写这些设置代码可能很耗时,尤其是当有多个测试都需要相同的步骤时。
在项目的整个生命周期中,测试代码应该易于理解、重构、扩展和维护。
Pytest中的Fixtures解决了一些代码重复和样板代码的问题。
它们帮助你定义可复用的设置或清理代码,这些代码可以在多个测试中使用。
无需在每个测试中都重复相同的设置代码,只需定义一次Fixtures,就可以在多个测试中使用。
这不仅减少了代码重复,还使维护更加容易,因为任何更改都只需在一个地方进行。
在本文中,你将进一步了解Pytest Fixtures、它们的优点,以及它们如何帮助你编写更好、更简单的单元测试。
学习目标
在本教程结束时,你应该能够:
定义什么是Pytest Fixtures。
理解Pytest Fixtures的优点。
在单元测试中使用Fixtures。
理解Fixtures作用域和参数化Fixtures。
编写有效、更易于维护且利用Fixtures的单元测试。
使用Flask构建一个简单的计算器API,并使用Pytest Fixtures对其进行测试。
什么是Pytest Fixtures
在深入探讨如何应用Fixtures之前,让我们先快速了解一下Fixtures到底是什么。
Fixtures是Pytest中的一些方法,它们为测试的运行提供了一个固定的基础。
Fixtures可用于为测试设置前置条件、提供数据,或者在测试完成后执行清理操作。
在Python中,它们是使用@pytest.fixture装饰器来定义的,并且可以作为参数传递给测试函数。
Fixtures极大地简化了编写测试的过程,它允许你在多个测试中复用代码,并为每个测试提供一个一致的起点。
Pytest有几个内置的Fixtures,适用于常见的用例,例如设置测试数据库、模拟外部依赖项以及设置测试数据。
Fixtures也有各种作用域,比如函数作用域、类作用域、模块作用域和会话作用域。
Fixtures的作用域定义了在测试会话期间Fixtures的可用时长。
这使你能够控制Fixtures的生命周期,并根据你的测试需求为Fixtures选择合适的作用域。我们将在本文后面详细讨论作用域。
总的来说,Fixtures是Pytest的一个强大功能,有助于减少代码重复,提高测试的可靠性,并使测试更具模块化和可维护性。
如何使用Pytest Fixtures
现在让我们进入本文的重点部分:如何通过创建一个真正简单的应用程序来使用Fixtures。
为了理解Fixtures,我们将构建一个基本的计算器应用程序,并使用Flask API来提供服务。
如果你不熟悉Flask,别担心,你可以跳过API及其测试部分,只关注核心逻辑(计算器部分)。
项目设置
按以下项目结构构建本文的测试代码组织:
源代码
这个示例的源代码是一个Flask API,它包含一个基本的计算器应用程序,可以计算两个数字的和、差、积和商。
计算器 /calculator/core.py
class Calculator: def__init__(self, a: int | float = None, b: int | float = None) -> None: self.a = a self.b = b defadd(self) -> int | float: """ 计算两个数字的和 返回:两个数字的和 """ return self.a + self.b defsubtract(self) -> int | float: """ 计算两个数字的差 返回:两个数字的差 """ return self.a - self.b defmultiply(self) -> int | float: """ 计算两个数字的积 返回:两个数字的积 """ return self.a * self.b defdivide(self) -> int | float: """ 计算两个数字的商 返回:两个数字的商 """ if self.b != 0: return self.a / self.b else: raise ZeroDivisionError("除数不能为零") defsquare(self) -> int | float: """ 计算一个数字的平方 返回:一个数字的平方 """ return self.a**2
上面是一个非常简单的Calculator类,用于执行基本的计算操作。
Flask应用程序
这个Flask应用程序为计算器提供了一个API包装器,允许我们向服务器发送远程请求并获取计算结果。
Flask应用程序如下所示:
/app/app.py
from flask import Flask, jsonify, request
from calculator.core import Calculator # 创建Flask应用程序
app = Flask(__name__) # 创建路由
@app.route('/')
defindex(): return'Index Page' # 为加法函数添加一个路由
@app.route('/api/add/', methods=['POST'])
defadd(): data = request.get_json() a = data['a'] b = data['b'] result = Calculator(a, b).add() return jsonify(result) # 为减法函数添加一个路由
@app.route('/api/subtract/', methods=['POST'])
defsubtract(): data = request.get_json() a = data['a'] b = data['b'] result = Calculator(a, b).subtract() return jsonify(result) # 为乘法函数添加一个路由
@app.route('/api/multiply/', methods=['POST'])
defmultiply(): data = request.get_json() a = data['a'] b = data['b'] result = Calculator(a, b).multiply() return jsonify(result) # 为除法函数添加一个路由
@app.route('/api/divide/', methods=['POST'])
defdivide(): data = request.get_json() a = data['a'] b = data['b'] if b == 0: return jsonify("除数不能为零"), 400 result = Calculator(a, b).divide() return jsonify(result) if __name__ == '__main__': app.run()
我们有4个简单的路由(每个操作对应一个),每个路由都接受一个POST请求,请求负载中包含两个值a和b。
这个应用程序调用上面的Calculator类来执行计算。
单元测试
单元测试定义在两个单独的文件中:
test_calculator_class.py——测试Calculator类。 test_calculator_api.py——使用自定义负载测试API端点。
让我们来看看每个文件,以及它们是如何使用Pytest Fixtures的。
测试中的Fixtures
定义Fixtures最简单的方法是在测试内部进行定义。让我们看看如何使用在测试中定义的Fixtures来测试我们的代码。
test_calculator_class.py
import pytest
from calculator.core import Calculator @pytest.fixture
def calculator(): return Calculator(2, 3)
使用预定义Fixtures进行基本计算器测试
def test_add(calculator): assert calculator.add() == 5deftest_subtract(calculator): assert calculator.subtract() == -1deftest_multiply(calculator): assert calculator.multiply() == 6deftest_divide(calculator): assert calculator.divide() == 0.6666666666666666deftest_divide_by_zero(calculator): calculator.b = 0with pytest.raises(ZeroDivisionError): calculator.divide()
在这里,我们使用@pytest.fixture装饰器定义了Pytest Fixtures。
我们使用值(2, 3)初始化了Calculator类,并返回了该类的一个实例。
然后,我们将这个Fixtures传递给每个单元测试,这样就无需在每个测试中重新初始化Calculator类了。
让我们看看如何对API也进行这样的操作。
test_calculator_api.py
import pytest
from app.app import app @pytest.fixture
defclient(): with app.test_client() as client: yield client @pytest.fixture
defjson_headers(): return {"Content-Type": "application/json"} deftest_add(client, json_headers, json_data): response = client.post("/api/add/", headers=json_headers, json=json_data) assert response.status_code == 200assert response.json == 3deftest_subtract(client, json_headers, json_data): response = client.post("/api/subtract/", headers=json_headers, json=json_data) assert response.status_code == 200assert response.json == -1deftest_multiply(client, json_headers, json_data): response = client.post("/api/multiply/", headers=json_headers, json=json_data) assert response.status_code == 200assert response.json == 2deftest_divide(client, json_headers, json_data): response = client.post("/api/divide/", headers=json_headers, json=json_data) assert response.status_code == 200assert response.json == 0.5deftest_divide_by_zero(client, json_headers): response = client.post("/api/divide/", headers=json_headers, json={"a": 1, "b": 0}) assert response.status_code == 400assert response.json == "除数不能为零"
在这个测试中,我们定义了两个Fixtures:
Flask客户端。
API请求的JSON头部信息。
如果你不熟悉API和Flask,我建议你阅读一些基础知识以便更好地理解。
上面的Fixtures允许我们定义一次客户端和JSON头部信息,并在测试中进行POST请求时复用它们。
通过conftest在多个测试中使用Fixtures 一种更高效的方法是将通用的Fixtures放在一个名为conftest.py的文件中,这样所有的单元测试文件都会自动获取到这些Fixtures。
如果你不熟悉conftest,这篇关于Pytest conftest的文章会给你一个坚实的基础。
conftest.py
import pytest
from calculator.core import Calculator
from app.app import app @pytest.fixture(scope="module")
defcalculator(): return Calculator(2, 3) @pytest.fixture
defcustom_calculator(scope="module"): def_calculator(a, b): return Calculator(a, b) return _calculator @pytest.fixture(scope="module")
defclient(): with app.test_client() as client: yield client @pytest.fixture(scope="module")
defjson_headers(): return {"Content-Type": "application/json"} @pytest.fixture(scope="module")
defjson_data(): return {"a": 1, "b": 2}
在这里,我们定义了Fixtures,并且可以在单元测试中轻松使用它们。
我们有各种Fixtures:
Calculator Fixtures。 自定义CalculatorFixtures(参数化Fixtures)。 Flask客户端Fixtures。 JSON头部信息Fixtures。 JSON数据Fixtures。
参数化Fixtures
这些Fixtures可以接受一个或多个参数,并在运行时进行初始化。
在前面代码块的示例中,我们定义了custom_calculatorFixtures,它允许我们在测试中传递不同的(a, b)值。
你可以通过在一个Fixtures中定义另一个Fixtures来定义参数化Fixtures。
例如:
@pytest.fixture
def custom_calculator(scope="module"): def _calculator(a, b): return Calculator(a, b) return _calculator
这个强大的功能允许我们为每个测试使用自定义值来初始化Calculator类,非常方便。
Fixtures依赖注入
Fixtures也可以被其他Fixtures调用(或请求),这被称为依赖注入。
下面的代码示例展示了这一点:
import pytest classMyObject: def__init__(self, value): self.value = value @pytest.fixture
defmy_object(): return MyObject("Hello, World!") deftest_my_object(my_object): assert my_object.value == "Hello, World!" @pytest.fixture
defmy_dependent_object(my_object): return MyObject(my_object.value + " Again!") deftest_my_dependent_object(my_dependent_object): assert my_dependent_object.value == "Hello, World! Again!"
在这里你可以看到,my_dependent_objectFixtures使用了my_objectFixtures。
除非有必要,我建议避免使用有依赖关系的Fixtures,因为这会增加复杂性,并且将Fixtures层层嵌套会使未来的重构变得困难。
自动使用Fixtures
如果你想找到一个简单的方法来避免在每个测试中都定义Fixtures,你可以在Fixtures定义中使用autouse=True标志作为参数。
当使用autouse=True时,这个Fixtures函数将自动应用于所有测试函数,而无需在每个测试函数中显式地将其作为参数传递。
如果你只想在某些测试函数中使用该Fixtures,你可以将测试函数名作为参数指定给@pytest.fixture装饰器,而不是使用autouse=True。
Fixtures作用域
Fixtures作用域定义了Fixtures的生命周期和可见性。
Fixtures的作用域决定了它将被调用的次数,以及在测试会话期间它的存活时长。
Pytest中可用的Fixtures作用域有:
function(函数作用域):为每个使用该Fixtures的测试函数创建Fixtures,并在测试函数结束时销毁。这是Fixtures的默认作用域。 class(类作用域):为每个使用该Fixtures的测试类创建一次Fixtures,并在测试类结束时销毁。 module(模块作用域):为每个使用该Fixtures的模块创建一次Fixtures,并在测试会话结束时销毁。 session(会话作用域):为每个测试会话创建一次Fixtures,并在测试会话结束时销毁。
要指定Fixtures的作用域,你可以将scope参数传递给@pytest.fixture装饰器。
选择合适的Fixtures作用域取决于Fixtures的用途和使用方式。
如果创建一个Fixtures的成本很高,例如数据库连接,你可能希望使用更高的作用域,以便在多个测试中复用该连接。
另一方面,如果一个Fixtures很轻量级,并且特定于单个测试,你可以使用默认的“function”作用域。
Fixtures中yield与return的区别
你可以使用yield和return语句将Fixtures的值提供给测试函数,但它们的行为和含义有所不同。
当你在Fixtures函数中使用yield时,设置代码会在第一次yield之前执行,而清理代码会在最后一次yield之后执行。
yield的示例:
import pytest @pytest.fixture
def my_fixture(): # 设置代码 yield "Fixtures值" # 清理代码
当你在Fixtures函数中使用return时,设置代码会在return语句之前执行,而清理代码会在return语句之后立即执行。
return的示例:
import pytest @pytest.fixture
def my_fixture(): # 设置代码 fixture_value = "Fixtures值" # 清理代码 return fixture_value
一般来说,当你需要为每个测试函数设置和清理一些资源时,通常会使用yield;而当你只需要为测试函数提供一个简单的值时,则使用return。
何时应该使用Fixtures
一般来说,Fixtures的一个很好的用例是:
客户端——数据库客户端、AWS或其他云客户端、需要设置/清理的API客户端。 测试数据——JSON或其他格式的测试数据可以很容易地导入并在多个测试中共享。 函数——一些常用的函数可以用作Fixtures。
结论
在本文中,你了解了Pytest Fixtures的优点,以及它们如何使编写和维护测试变得更加容易。
你还学习了Pytest Fixtures的基础知识以及如何定义它们。
你构建了一个由Flask API驱动的基本计算器应用程序,并使用conftest.py和在测试内部定义了Fixtures。
最后,你了解了自动使用、作用域以及如何对Fixtures进行参数化,这些都是Pytest非常强大的功能。
Fixtures可用于设置数据库连接、加载测试数据、初始化复杂对象,或执行测试所需的任何其他设置或清理操作。
通过使用Fixtures,你可以编写干净、模块化且可维护的测试代码,这些代码易于阅读和理解。
通过一些练习和实践,你可以利用Pytest Fixtures使你的测试过程更快、更高效、更有效。
相关文章:
深度剖析:Pytest Fixtures如何重塑自动化测试的可读性与高效性
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 在编写单元测试时,是否发现自己写了很多相同/相似代码呢? 像…...
AIP-181 稳定级别
编号181原文链接AIP-181: Stability levels状态批准创建日期2019-02-18更新日期2019-02-18 虽然不同组织(谷歌或其他组织)拥有不同的产品生命周期,AIP使用以下术语指代API组件 稳定性 。 注意 这些稳定级别大致对应于Google Cloud中的产品发…...
比较 (leetcode 452. 用最少数量的箭引爆气球 leetcode 435. 无重叠区间 leetcode 56. 合并区间
leetcode系列 文章目录 一、射箭引爆气球二、无重叠区间三、合并区间总结 提示:小白个人理解,如有错误敬请谅解! 对于此类题目,都先按左区间排序,之后根据重叠还是不重叠来进行操作 一、射箭引爆气球 找到最大的重叠…...
什么是有限元力学?分而治之,将复杂问题转化为可计算的数学模型
有限元力学是应用有限元方法(Finite Element Method, FEM)解决力学问题的学科,属于计算力学的重要分支。它通过将复杂的连续体结构离散化为有限个简单单元的组合,结合数学和物理原理,近似求解力学行为(如应…...
python项目一键加密,极度简洁
在要加密的项目内运行python -m pip install py2safe 安装后cd到项目的根目录,运行py2safe 它会递归加密所有文件夹,不需要参数,拿过来就用,基于pyarmor开发,基本破解不了,太方便辣 这是readme文件,不仅提到了用法,还贴心的加入了口腔溃疡的治疗办法,真是太贴心了 # py2saf…...
STM32 ADC原理与驱动详解:从存储器映射到多通道采集(下) | 零基础入门STM32第六十六步
主题内容教学目的/扩展视频ADC读电位器和光敏重点课程电路原理,跳线设置,ADC功能分析,驱动程序,读出AD数据,读内部温度传感器数据。会设置参数,能读出AD值即可。 师从洋桃电子,杜洋老师 本文深入…...
JxBrowser 8.5.0 版本发布啦!
• 为 Compose Desktop 提供了硬件加速渲染支持 • 支持自定义 Chromium 二进制文件的品牌标识 • 多项质量改进 了解更多 获取 30 天免费试用...
LIN接口
LIN接口 前言LIN接口简介帧格式同步间隔段 (Break Field)同步段 (Sync Byte Field)受保护ID段 (Protected Identifier Field)数据段 (Data Field)校验和段 (Checksum Field) 帧在总线上的传输波形帧类型无条件帧事件触发帧偶发帧诊断帧保留帧 错误类型 IP 设计结构框图接口设计…...
【蓝桥杯每日一题】3.16
🏝️专栏: 【蓝桥杯备篇】 🌅主页: f狐o狸x 目录 3.9 高精度算法 一、高精度加法 题目链接: 题目描述: 解题思路: 解题代码: 二、高精度减法 题目链接: 题目描述&…...
prometheus-helm的使用
1、部署Prometheus监控平台 1、下载安装Prometheus (当前集群版本1.26.3) git clone https://github.com/prometheus-operator/kube-prometheus.git -b release-0.12 安装: cd kube-prometheus/ 创建命名空间和crd: kubectl …...
时间序列分析的军火库:AutoTS、Darts、Kats、PaddleTS、tfts 和 FancyTS解析
引言:时间序列分析的现代挑战 时间序列分析在多个领域中扮演着关键角色,包括工程、金融、气象、工业预测等。随着开源工具的快速发展,开发者可以通过多种库快速实现时间序列预测与分析。本文将对 AutoTS、Darts、Kats、PaddleTS、tfts 和 FancyTS 六大主流库进行详细解析,…...
TLSR8355F128芯片特色解析
TLSR8355F128 是泰凌微推出的一款高性能、低功耗的无线物联网芯片,具有以下特色: 丰富的协议支持:支持 2.4GHz 私有协议。这使得该芯片能够广泛应用于各种特殊的物联网场景,实现不同设备之间的互联互通。强大的处理能力ÿ…...
基于分类算法的学习失败预警(上)
文章目录 前言1.数据预处理1.1数据探索1.2数值化处理1.3空值填充1.4添加标签1.5特征筛选1.6数据集类别平衡1.7划分数据集1.8训练集类平衡1.9标准化 2.模型选择2.1建立模型2.2模型调参2.2.1遍历调参2.2.2网格搜索 结语 前言 本次案例通过对现有数据分析,采用如下图所…...
首页性能优化
首页性能提升是前端优化中的核心任务之一,因为首页是用户访问的第一入口,其加载速度和交互体验直接影响用户的留存率和转化率。 1. 性能瓶颈分析 在优化之前,首先需要通过工具分析首页的性能瓶颈。常用的工具包括: Chrome DevTo…...
整形在内存中的存储(例题逐个解析)
目录 一.相关知识点 1.截断: 2.整形提升: 3.如何 截断,整型提升? (1)负数 (2)正数 (3)无符号整型,高位补0 注意:提升后得到的…...
python中多重继承和泛型 作为模板让子类实现具体业务逻辑
示例代码: T TypeVar("T", bound"NoSQLBaseDocument")# 与 MongoDB 数据库交互的基础文档类 class NoSQLBaseDocument(BaseModel, Generic[T], ABC):id: UUID4 Field(default_factoryuuid.uuid4)def __eq__(self, value: object) -> bool…...
2025 香港 Web3 嘉年华:全球 Web3 生态的年度盛会
自 2023 年首届香港 Web3 嘉年华成功举办以来,这一盛会已成为全球 Web3 领域规模最大、影响力最深远的行业活动之一。2025 年 4 月 6 日至 9 日,第三届香港 Web3 嘉年华将在香港盛大举行。本届活动由万向区块链实验室与 HashKey Group 联合主办、W3ME 承…...
ERC-6909 最小多代币标准
ERC-6909 Token标准是 ERC-1155 Token标准的一种简化替代方案。 ERC-1155 标准引入了一种多Token接口,使得单个智能合约能够结合可替代的和不可替代的Token(即,ERC20 和 ERC721)。 ERC-1155 解决了多个挑战,例如降…...
07-单链表-单链表基本操作
题目 来源 826. 单链表 - AcWing题库 思路 详见代码,主要思想就是用数组来模拟链表的创建。数组其实跟静态链表等价,由于动态链表动态new对于大数据太过于耗时,因此采用数组的方式。那数组如何起到链表的效果?用下标来索引。 …...
FFMPEG录制远程监控摄像头MP4
手绘效果图 上图是录制功能的HTML前端页面,录制功能和解码视频放在一起。录制功能关键是录制(开始录制按钮)、停止录像按钮。当点击“录制”的时候则会开始录制MP4文件, 当点击停止的时候就会停止录制MP4。经过录制后,则会生成MP4,并放到我的RV1126的/tm…...
Spring Boot 的自动装配
Spring Boot 的自动装配(Auto Configuration)是其核心特性之一,通过智能化的条件判断和配置加载机制,极大简化了传统 Spring 应用的配置复杂度。其原理和实现过程可概括为以下几个关键点: 一、核心触发机制:…...
Python中的“泛型”和“多重继承”
“泛型”和“多重继承”属于 Python 的语法规则。 1. 泛型(Generic[T]) 通俗解释 泛型允许你在定义类或函数时,不指定具体的类型,而是使用一个“占位符”(通常命名为 T)。这就像你制作一个盒子࿰…...
【C++】多参数构造函数使用explict的情形
在 C 中,“无非默认值” 指的是:构造函数的参数没有设置默认值(即所有参数都必须显式传递)。这个说法通常出现在讨论多参数构造函数是否需要使用 explicit 关键字时。 具体解释 多参数构造函数: • 如果一个构造函数有…...
C# Unity 唐老狮 No.10 模拟面试题
本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho C# 1. 内存中,堆和…...
使用DeepSeek,优化斐波那契数函数,效果相当不错
下面这段代码定义了一个递归函数 fibonacci,用于计算第 n 个斐波那契数。 def fibonacci(n):if n < 1:return nelse:return fibonacci(n - 1) fibonacci(n - 2)虽然代码逻辑正确,但其性能较差,尤其是对于较大的 n 值,其复杂度…...
【GPT入门】第22课 langchain LCEL介绍
【GPT入门】第22课 langchain LCEL介绍 1. LCEL介绍与特点2. 原生API与LCEL的对比2. 简单demo 1. LCEL介绍与特点 LCEL 即 LangChain Expression Language,是 LangChain 推出的一种声明式语言,用于简化和优化在 LangChain 框架内构建复杂链和应用的过程…...
市场监管总局升级12315平台 专项整治四大市场顽疾保障消费安全
大湾区经济网湾区财经讯,在今天下午举行的国务院新闻办新闻发布会上,市场监管总局负责人表示,将开展食品非法添加、假冒伪劣、价格欺诈、虚假宣传四大领域专项整治行动,并强化缺陷产品召回监管,全面保障消费者“安全消…...
FineBI6.x进阶篇-可视化专题
参考 参考:https://edu.fanruan.com/video/526 如何选择合适的图表:https://help.fanruan.com/dvg/doc-view-3.html 参考:https://help.fanruan.com/finebi/ 什么是GLAD原则:https://help.fanruan.com/dvg/doc-view-81.html …...
一对一交友App源码开发新趋势:精准匹配与多元盈利模式解析
一、 营商环境分析:机遇与挑战并存 近年来,随着移动互联网的普及和用户需求的不断升级,一对一交友App市场呈现出蓬勃发展的态势。然而,机遇与挑战并存,开发者需要审时度势,才能在激烈的市场竞争中脱颖而出…...
算法基础篇(蓝桥杯常考点)
算法基础篇 前言 算法内容还有搜索,数据结构(进阶),动态规划和图论 数学那个的话大家也知道比较难,放在最后讲 这期包含的内容可以看目录 模拟那个算法的话就是题说什么写什么,就不再分入目录中了 注意事…...
【Pandas】pandas Series cat
# Pandas2.2 Series ## Accessors |方法|描述| |-|:-------| |Series.str|对 Series 中的字符串元素进行矢量化字符串操作| |Series.cat|用于处理分类数据(Categorical Data)的属性| ### pandas.Series.cat pandas.Series.cat 是用于处理分类数据&am…...
Python的类和对象(3)
1、类的继承 父类:被继承 子类:继承者 – 可以使用父类的所有属性和方法、大大简化代码。 语法:在类名字后加上(继承的类名字) # 定义类 -- 父类 class Car:# 定义类属性wheel "有车轮"engine "有引…...
C语言修饰符汇总详解
在C语言中,修饰符(或称类型限定符)是用于修饰数据类型的关键字,可以改变变量或类型的性质和行为。它们通常用来控制存储类型、符号、大小、对齐、访问权限等。C语言中的修饰符主要可以分为以下几类: 类型修饰符存储类别修饰符常量和易变修饰符以下是C语言中所有修饰符的详…...
猎豹移动(Cheetah Mobile)
本文来自腾讯元宝 公司背景与发展历程 成立与早期定位 猎豹移动成立于2010年11月,由金山安全与可牛影像合并而成,初期以移动安全工具和清理软件为核心业务。其明星产品包括《猎豹清理大师》(Clean Master)和《猎豹浏览器》&…...
VLN 论文精读(二)VL-Nav: Real-time Vision-Language Navigation with Spatial Reasoning
这篇笔记用来描述2025年发表在arxiv上的一篇有关VLN领域的论文,由纽约州立大学布法罗分校和卡耐基梅隆联合发布。其主要创新点在于:像素级的视觉-语意特征、低算力移动设备部署、30Hz控制实时性、VLM模型的zero-shot ; 整个导航流程大概如下…...
优选算法系列(2.滑动窗口 _ 上)
目录 解法⼀(暴力求解)(不会超时,可以通过):一.长度最小的子数组(medium) 题目链接209. 长度最小的子数组 - 力扣(LeetCode) 解法: 代码&#…...
RK3568 android11 基于PN7160的NXP NFC移植
一,概述 1. 模块概述 PN7160专为在各种系统实现快速集成而设计,支持所有符合NFC Forum的模式,包括Android和Linux驱动程序,并支持实时操作系统和无操作系统的应用(PN7160不符合EMVCo)。嵌入式NFC固件减少了对主机交互的需求,并最大限度缩小了代码尺寸,使设计更轻松。…...
【网工第6版】第1章 计算机网络概论
目录 1计算机网络形成和发展 ■计算机网络 ■我国互联网发展 ■计算机网路分类 ■计算机网络应用 2 OSI和TCP/IP参考模型 ■网络分层的意义 ■OSI参考模型 ■TCP/IP参考模型 ■TCP/IP参考模型协议 3 数据封装与解封过程 ■封装 ■解封 1计算机网络形成和发展 ■计…...
【嵌入式】keil5安装(同时兼容C51和STM32)
最近在开发STM32的时候,安装Keil5,遇到STM32和C51的共存的问题,在网上找了很多方法,又遇到一些bug,最终还是弄好了。因此将处理的过程记录下来,希望对遇到相同问题的朋友一些启发。 1、下载安装包 Keil P…...
每日一题--进程与协程的区别
进程是什么? 进程(Process) 是操作系统进行 资源分配和调度的基本单位,代表一个正在执行的程序实例。每个进程拥有独立的虚拟地址空间、代码、数据和系统资源(如文件句柄、网络端口等)。进程之间通过 IPC&…...
网络安全运维应急响应与溯源分析实战案例
在日常运维过程中,网络安全事件时有发生,快速响应和精准溯源是保障业务稳定运行的关键。本文将通过一个实际案例,详细解析从发现问题到溯源定位,再到最终解决的完整流程。 目录 一、事件背景 二、事件发现 1. 监控告警触发 2…...
leetcode29. 两数相除-medium
1 题目:两数相除 官方标定难度:中 给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断,也就是截去(truncate)其小数部分。…...
深海300米的低温环境中的BMS优化方法
在深海300米的低温环境中,采用扩展卡尔曼滤波(EKF)结合温度补偿模型实现电池管理系统(BMS)的荷电状态(SOC)精确估计,需通过以下步骤实现: 1. 低温电池模型建立 1.1 电池…...
高主频GPU+RTX4090:AI生图性能优化超150%
概述:消费级高主频CPU搭配 RTX 4090显卡可以显著提高AI生图的性能,相比于企业级CPU具有更大的吞吐量和更优的成本效益。 引言:在AI图像生成过程中,CPU与GPU的协同效应对系统的整体性能至关重要。测试表明,与RTX 4090显…...
OpenCV 图像双线性插值
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 双线性插值是一种 二维插值方法,用于计算 栅格(Grid) 或 像素点 之间的插值值。它主要用于 图像缩放、旋转、变换 等操作,以在新像素位置估算灰度值或颜色值。 如上图所示,假设存在一个二维离散函数(如图像)…...
OpenCV计算摄影学(23)艺术化风格化处理函数stylization()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 风格化的目的是生成不以照片写实为目标的多种多样数字图像效果。边缘感知滤波器是风格化处理的理想选择,因为它们能够弱化低对比度区…...
《我的Python觉醒之路》之转型Python(十五)——控制流
[今天是2025年3月17日,继续复习第一章节、第二章节的内容 ] 《我的Python觉醒之路》之转型Python(十四)——控制流...
内存管理
一.什么是内存管理呢? 我们可以来看一下这个图,我们来了解一下这些地方都存的是什么。 数据段就是存放全局和静态变量的,代码段是存放常量的。 栈 局部变量:在函数内部定义的变量,其存储空间在栈上分配。当函数被调用时…...
学习threejs,使用MeshLambertMaterial漫反射材质
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshLambertMaterial…...
P41-指针进阶1、2
1.字符指针 2.数组指针 3.指针数组 4.数组传参和指针传参 5.函数指针 6.函数指针数组 7.指向函数指针数组的指针 8.回调函数 9.指针和数组面试题的解析 指针的主题,我们在初级阶段的《指针》章节已经接触过了,我们知道了指针的概念 1.指针就是个…...