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

【Python-Day 29】万物皆对象:详解 Python 类的定义、实例化与 `__init__` 方法

Langchain系列文章目录

01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
07-【深度解析】从GPT-1到GPT-4:ChatGPT背后的核心原理全揭秘
08-【万字长文】MCP深度解析:打通AI与世界的“USB-C”,模型上下文协议原理、实践与未来

Python系列文章目录

PyTorch系列文章目录

机器学习系列文章目录

深度学习系列文章目录

Java系列文章目录

JavaScript系列文章目录

Python系列文章目录

01-【Python-Day 1】告别编程恐惧:轻松掌握 Python 安装与第一个程序的 6 个步骤
02-【Python-Day 2】掌握Python基石:变量、内存、标识符及int/float/bool数据类型
03-【Python-Day 3】玩转文本:字符串(String)基础操作详解 (上)
04-【Python-Day 4】玩转文本:Python 字符串常用方法深度解析 (下篇)
05-【Python-Day 5】Python 格式化输出实战:%、format()、f-string 对比与最佳实践
06- 【Python-Day 6】从零精通 Python 运算符(上):算术、赋值与比较运算全解析
07-【Python-Day 7】从零精通 Python 运算符(下):逻辑、成员、身份运算与优先级规则全解析
08-【Python-Day 8】从入门到精通:Python 条件判断 if-elif-else 语句全解析
09-【Python-Day 9】掌握循环利器:for 循环遍历序列与可迭代对象详解
10-【Python-Day 10】Python 循环控制流:while 循环详解与 for 循环对比
11-【Python-Day 11】列表入门:Python 中最灵活的数据容器 (创建、索引、切片)
12-【Python-Day 12】Python列表进阶:玩转添加、删除、排序与列表推导式
13-【Python-Day 13】Python 元组 (Tuple) 详解:从创建、操作到高级应用场景一网打尽
14-【Python-Day 14】玩转Python字典(上篇):从零开始学习创建、访问与操作
15-【Python-Day 15】深入探索 Python 字典 (下):常用方法、遍历、推导式与嵌套实战
16-【Python-Day 16】代码复用基石:详解 Python 函数的定义与调用
17-【Python-Day 17】玩转函数参数(上):轻松掌握位置、关键字和默认值
18-【Python-Day 18】玩转函数参数(下):*args 与 **kwargs 终极指南
19-【Python-Day 19】函数的回响:深入理解 return 语句与返回值
20-【Python-Day 20】揭秘Python变量作用域:LEGB规则与global/nonlocal关键字详解
21-【Python-Day 21】一行搞定!Python lambda 匿名函数的妙用与实战
22-【Python-Day 22】代码的基石:模块(Module)的导入与使用详解
23-【Python-Day 23】Python 模块化编程实战:创建、导入及 sys.path 深度解析
24-【Python-Day 24】告别杂乱代码!一文掌握 Python 包(Package)的创建与使用
25-【Python-Day 25】玩转数字:精通 math 与 random 模块,从数学运算到随机抽样
26-【Python-Day 26】解锁时间魔法:深入解析 time 与 datetime 模块
27-【Python-Day 27】轻松驾驭操作系统:精通 os 与 sys 模块核心功能
28-【Python-Day 28】从指令到蓝图:Python面向对象编程(OOP)入门指南
29-【Python-Day 29】万物皆对象:详解 Python 类的定义、实例化与 __init__ 方法


文章目录

  • Langchain系列文章目录
  • Python系列文章目录
  • PyTorch系列文章目录
  • 机器学习系列文章目录
  • 深度学习系列文章目录
  • Java系列文章目录
  • JavaScript系列文章目录
  • Python系列文章目录
  • 前言
  • 一、回顾:什么是类和对象?
      • 1.1.1 蓝图与实体
      • 1.1.2 属性与行为
  • 二、定义一个简单的类:`class` 关键字
      • 2.1.1 基本语法
      • 2.1.2 实例化:从类创建对象
  • 三、灵魂所在:构造方法 `__init__` 与 `self`
      • 3.1.1 什么是构造方法 `__init__`?
      • 3.1.2 `self` 的奥秘
      • 3.1.3 定义带属性的类
  • 四、访问对象的属性和方法
      • 4.1.1 访问实例属性
      • 4.1.2 修改实例属性
      • 4.1.3 定义实例方法
      • 4.1.4 调用实例方法
  • 五、实战场景:创建一个“英雄”类
      • 5.1.1 需求分析
      • 5.1.2 代码实现
      • 5.1.3 模拟对战
  • 六、总结


前言

在上一篇文章中,我们共同揭开了面向对象编程(OOP)的神秘面纱,理解了“类(Class)”和“对象(Object)”这两个核心概念的理论基础。我们知道,类是创建对象的蓝图,而对象则是类的具体实例。

理论是行动的指南,但真正的掌握源于实践。从本篇文章开始,我们将正式从理论迈向实战,动手创建并使用我们自己的 Python 类。这篇文章将是您踏入 Python 面向对象世界的第一步,也是至关重要的一步。我们将详细讲解如何使用 class 关键字定义一个类,深入剖析构造方法 __init__ 的作用,并彻底搞懂那个让许多初学者困惑的 self 参数究竟是什么。

准备好了吗?让我们一起从零开始,构建属于你自己的第一个 Python 类!

一、回顾:什么是类和对象?

在动手编码之前,让我们通过一个生动的类比,快速回顾一下类与对象的关系,为后续的实践打下坚实的基础。

1.1.1 蓝图与实体

想象一下,一位汽车设计师绘制了一张“汽车设计蓝图”。

  • 类 (Class):就是这张设计蓝图。它详细定义了汽车应该具备的所有通用特性(属性),比如品牌、颜色、型号,以及能够执行的功能(方法),比如启动、加速、刹车。蓝图本身并不是一辆可以驾驶的汽车,它只是一个模板或规范。

  • 对象 (Object):就是根据这张蓝图制造出来的每一辆具体的汽车。每一辆车(对象)都遵循蓝图(类)的设计,但又拥有自己独特的属性值。例如,一辆是“红色的法拉利”,另一辆是“黑色的特斯拉”。它们都是“汽车”这个类的实例,但它们是相互独立的实体。

1.1.2 属性与行为

  • 属性 (Attribute):对象的特征或状态,在代码中通常表现为变量。例如,对于一个“人”类,nameageheight 就是属性。
  • 方法 (Method):对象的行为或能力,在代码中通常表现为函数。例如,“人”可以 eat()sleep()work()

我们的目标就是学习如何用 Python 代码来描述这张“蓝图”(定义类),并根据它来创建具体的“实体”(实例化对象)。

二、定义一个简单的类:class 关键字

在 Python 中,定义类的语法非常直观,我们使用 class 关键字。

2.1.1 基本语法

让我们从最简单的形式开始,创建一个代表“狗”的类。

class Dog:pass

代码解析:

  • class Dog:class 是关键字,告诉 Python 我们正在定义一个类。Dog 是我们给这个类起的名字。类名的命名规范通常遵循 大驼峰命名法 (PascalCase),即每个单词的首字母都大写,例如 MyClassName
  • pass:是一个占位符语句,表示“什么都不做”。因为 Python 的语法要求代码块(如类定义、函数定义等)不能为空,所以当我们想创建一个最精简的空类时,就需要使用 pass

2.1.2 实例化:从类创建对象

我们已经有了 Dog 类的“蓝图”,现在就可以根据它来创建具体的“狗”对象了。这个过程称为实例化 (Instantiation)

语法非常简单,就像调用一个函数一样:

# 实例化一个 Dog 对象,并将其赋值给变量 my_dog
my_dog = Dog()# 我们可以再创建一个
another_dog = Dog()# 打印这两个对象,看看会发生什么
print(my_dog)
print(another_dog)# 使用 type() 函数查看它们的类型
print(type(my_dog))

输出结果 (内存地址会不同):

<__main__.Dog object at 0x000001A8D9B43E20>
<__main__.Dog object at 0x000001A8D9B43E50>
<class '__main__.Dog'>

结果分析:

  1. my_dog = Dog() 这行代码就完成了一次实例化。它创建了一个 Dog 类的实例,并把这个实例(对象)的引用存放在了 my_dog 这个变量里。
  2. 打印 my_doganother_dog,我们看到它们是两个不同的 Dog 对象,位于内存中的不同地址 (0x...)。这证明了每个实例都是独一无二的。
  3. type(my_dog) 的输出 <class '__main__.Dog'> 明确告诉我们,my_dog 这个变量的类型是我们刚刚定义的 Dog 类。

目前,我们的 Dog 类还只是一个空壳,它没有具体的属性(比如名字、年龄)和行为(比如吠叫)。接下来,我们将学习如何让它变得丰满起来。

三、灵魂所在:构造方法 __init__self

要让每个 Dog 对象都拥有自己独特的名字和年龄等信息,我们需要在对象被创建的那一刻就为它设定好这些初始属性。这就需要用到一个非常特殊的函数——构造方法 __init__

3.1.1 什么是构造方法 __init__

__init__ 是 Python 类中的一个特殊方法(也称为“魔术方法”或“双下划线方法”)。它的名字前后都有两个下划线。

它的核心作用是:在类的实例被创建时,自动被调用,用于完成对象的初始化工作。

你可以把它想象成工厂流水线上的“初始化工位”。每当一个新产品(对象)从生产线上下来(被创建),它都会自动经过这个工位,进行喷漆、贴标签等一系列初始化操作。

3.1.2 self 的奥秘

在介绍 __init__ 的用法之前,我们必须先理解 selfself 是类中方法(函数)的第一个参数,它是一个让无数初学者感到困惑的概念。

一句话解释 selfself 代表的就是类的实例(对象)本身。

当一个对象调用它的方法时,Python 会自动将这个对象本身作为第一个参数传递给该方法。这个参数,按照约定俗成的惯例,我们都将其命名为 self

举个例子:
当我们执行 my_dog = Dog("Buddy", 3) 来创建一个 Dog 对象时,Python 内部大致会做两件事:

  1. 先在内存中创建一个空的 Dog 对象。
  2. 然后自动调用 __init__ 方法,并将这个刚刚创建的空对象作为第一个参数传递进去,即 Dog.__init__(刚刚创建的空对象, "Buddy", 3)。在这个 __init__ 方法内部,self 就指向了这个“刚刚创建的空对象”。

通过 self,我们就可以在类的内部访问和操作这个对象自身的属性和方法了。

3.1.3 定义带属性的类

现在,让我们结合 __init__self 来改造我们的 Dog 类,让它在创建时就能拥有名字、品种和年龄。

class Dog:# 定义构造方法def __init__(self, name, breed, age):"""初始化一只新的小狗对象。"""print(f"初始化开始... 一只新的小狗对象正在被创建!")# 将传入的参数值赋给实例的属性# self.name 创建了一个属于该实例的属性 nameself.name = nameself.breed = breedself.age = ageprint(f"初始化完成!你好,我叫 {self.name}。")# 实例化时,在类名后的括号里传入 __init__ 方法需要的参数 (除了 self)
dog1 = Dog("旺财", "中华田园犬", 2)
print("-" * 20)
dog2 = Dog("Buddy", "金毛巡回犬", 3)

输出结果:

初始化开始... 一只新的小狗对象正在被创建!
初始化完成!你好,我叫 旺财。
--------------------
初始化开始... 一只新的小狗对象正在被创建!
初始化完成!你好,我叫 Buddy。

代码解析:

  1. def __init__(self, name, breed, age)::我们定义了构造方法。它的第一个参数必须self。后面的 name, breed, age 是我们希望在创建对象时接收的外部数据。
  2. self.name = name:这是 __init__ 方法的核心。
    • self.name:表示“为当前这个对象(self)创建一个名为 name 的属性”。这种与 self 关联的属性称为实例属性 (Instance Attribute)
    • = name:将传入的参数 name 的值赋给这个实例属性。
  3. 实例化过程
    • 当我们执行 dog1 = Dog("旺财", "中华田园犬", 2) 时,Python 自动调用 __init__ 方法,并将 dog1 这个实例传给 self,“旺财” 传给 name,“中华田园犬” 传给 breed,2 传给 age
    • 方法内部,self.name = "旺财"self.breed = "中华田园犬"self.age = 2 等语句就为 dog1 这个具体对象设置了它独有的属性。
    • dog2 的创建过程同理,它也拥有自己的一套独立的属性值。

四、访问对象的属性和方法

创建了带有属性的对象后,我们自然需要一种方式来使用这些属性,并命令对象去执行某些行为(调用方法)。

4.1.1 访问实例属性

我们可以使用“点 (.) 操作符”来访问一个对象的属性。

语法:对象名.属性名

# 延续上面的代码
print(f"{dog1.name} 是一只 {dog1.breed}。")
print(f"{dog2.name} 今年 {dog2.age} 岁了。")

输出结果:

旺财 是一只 中华田园犬。
Buddy 今年 3 岁了。

dog1.name 精确地获取了 dog1 这个对象的 name 属性值,而 dog2.name 获取的是 dog2 对象的,两者互不干扰。

4.1.2 修改实例属性

实例属性的值是可变的(除非我们使用更高级的技巧来限制)。修改它同样使用点操作符。

print(f"过生日之前, {dog1.name}{dog1.age} 岁。")# 修改 age 属性
dog1.age = dog1.age + 1 
# 或者使用更简洁的写法
# dog1.age += 1print(f"过完生日后, {dog1.name} 现在是 {dog1.age} 岁了。")

输出结果:

过生日之前, 旺财 是 2 岁。
过完生日后, 旺财 现在是 3 岁了。

4.1.3 定义实例方法

光有属性还不够,对象应该有自己的行为。在类中定义的函数,我们称之为方法 (Method)。与实例属性一样,能访问实例属性的方法称为实例方法 (Instance Method)

实例方法的第一个参数也必须是 self,这样它才能访问到调用该方法的对象的内部属性。

让我们给 Dog 类添加两个方法:bark() (吠叫) 和 describe() (自我介绍)。

class Dog:def __init__(self, name, breed, age):self.name = nameself.breed = breedself.age = age# 定义一个实例方法def bark(self):# self 在这里同样代表调用这个方法的那个实例return f"{self.name} 说: 汪!汪汪!"# 定义另一个使用多个属性的实例方法def describe(self):return f"你好,我是 {self.name}, 我是一只 {self.age} 岁的 {self.breed}。"

4.1.4 调用实例方法

调用方法和访问属性的方式完全一样,也是使用点操作符,但方法名后面需要加上一对括号 ()

语法:对象名.方法名()

dog1 = Dog("旺财", "中华田园犬", 3)
dog2 = Dog("Buddy", "金毛巡回犬", 3)# 调用 dog1 的方法
bark_sound = dog1.bark()
description = dog1.describe()
print(bark_sound)
print(description)print("-" * 20)# 调用 dog2 的方法
print(dog2.bark())
print(dog2.describe())

输出结果:

旺财 说: 汪!汪汪!
你好,我是 旺财, 我是一只 3 岁的 中华田园犬。
--------------------
Buddy 说: 汪!汪汪!
你好,我是 Buddy, 我是一只 3 岁的 金毛巡回犬。

深入理解调用过程:当你执行 dog1.bark() 时,Python 实际上做的是 Dog.bark(dog1)。它将 dog1 这个实例作为第一个参数(即 self)传递给了 bark 方法。这就是为什么在方法内部,self 能够引用到 dog1 的所有属性(如 self.name)。

五、实战场景:创建一个“英雄”类

理论学习后,让我们通过一个更有趣的实战案例来巩固所学知识。假设我们在开发一款简单的文字对战游戏,我们需要创建一个 Hero 类。

5.1.1 需求分析

  1. 属性: 每个英雄都应该有名字(name)、生命值(hp)和攻击力(ap)。
  2. 方法:
    • attack(target):一个英雄可以攻击另一个英雄,对目标造成伤害(减少目标的 hp)。
    • show_status():可以显示英雄当前的状态信息。

5.1.2 代码实现

import timeclass Hero:"""代表一个游戏中的英雄角色。"""def __init__(self, name, hp=100, ap=15):"""初始化英雄属性,hp 和 ap 可以有默认值。"""self.name = nameself.hp = hpself.ap = apprint(f"英雄 {self.name} 已降临战场! [HP: {self.hp}, AP: {self.ap}]")def attack(self, target):"""攻击另一个英雄 (target)。target: 另一个 Hero 对象。"""if self.hp <= 0:print(f"{self.name} 已经阵亡,无法发起攻击。")return # 提前结束方法if target.hp <= 0:print(f"攻击失败:{target.name} 已经阵亡。")returnprint(f"【战斗】{self.name}{target.name} 发起了猛烈的攻击!")# 目标英雄的 hp 减少攻击者的 ap 值target.hp -= self.apprint(f"          造成了 {self.ap} 点伤害。")if target.hp <= 0:target.hp = 0 # 避免 hp 出现负数print(f"          {target.name} 被击败了!")else:print(f"          {target.name} 剩余生命值: {target.hp}")def show_status(self):"""显示英雄当前的状态。"""status = "存活" if self.hp > 0 else "阵亡"print(f"--- 状态面板 [{self.name}] ---")print(f"  生命值 (HP): {self.hp}")print(f"  攻击力 (AP): {self.ap}")print(f"  当前状态: {status}")print(f"--------------------------")

这个 Hero 类比 Dog 类更复杂一些,它不仅有属性,还有一个可以与其他同类对象交互的 attack 方法,这正是面向对象编程强大之处的体现。

5.1.3 模拟对战

现在,让我们创建两位英雄,并让他们进行一场简单的对决!

# 创建两位英雄实例
garen = Hero("盖伦", hp=150, ap=10)
darius = Hero("德莱厄斯", hp=120, ap=12)time.sleep(1) # 暂停1秒,让输出更有节奏感
print("\n===== 战斗开始! =====\n")
time.sleep(1)# 第一回合
darius.attack(garen)
garen.show_status()
time.sleep(1)# 第二回合
garen.attack(darius)
darius.show_status()
time.sleep(1)# 第三回合
darius.attack(garen)
garen.show_status()print("\n===== 战斗结束! =====\n")

运行上述代码,你将看到一场生动的文字直播战斗,这全部是通过我们定义的 Hero 类和它的实例对象之间的交互完成的。

六、总结

恭喜你!通过本文的学习和实践,你已经成功创建并使用了自己的第一个 Python 类。这是你从面向过程思维转向面向对象思维的关键一步。让我们对今天的核心知识点进行梳理和总结:

  1. 类的定义:使用 class 关键字来声明一个类,类名推荐使用大驼峰命名法(PascalCase)。类是创建对象的模板。

  2. 构造方法 __init__:一个特殊的“魔术方法”,在通过类创建对象时被自动调用。它的主要职责是完成新对象的初始化工作,如设置初始属性。

  3. self 参数:是所有实例方法的第一个参数,它代表调用该方法的对象实例本身。通过 self,我们可以在类的内部访问实例的属性和调用其他实例方法。它是一个约定俗成的名称,请务必遵守。

  4. 实例属性:与特定对象实例绑定的变量(例如 self.name)。它们在 __init__ 方法中定义,每个对象都拥有一份自己独立的副本,互不影响。

  5. 实例化:通过 类名() 的形式创建类的具体实例(对象)。如果 __init__ 方法有其他参数,需要在括号内提供相应的值。

  6. 访问与调用:统一使用点 (.) 操作符来访问对象的属性(object.attribute)和调用其方法(object.method())。

  7. 封装思想初探:通过本章的学习,我们已经初步体验了面向对象三大特性之一的“封装”。类将描述对象状态的数据(属性)和操作这些数据的代码(方法)巧妙地“封装”在了一起,形成了一个功能完整的独立单元。

在下一篇文章中,我们将继续深入探索类的世界,学习不同类型的方法(实例方法、类方法、静态方法)及其各自的应用场景。请务必勤加练习,真正消化今天的内容!


相关文章:

【Python-Day 29】万物皆对象:详解 Python 类的定义、实例化与 `__init__` 方法

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

内存泄漏和内存溢出的区别

内存泄漏&#xff08;Memory Leak&#xff09;和内存溢出&#xff08;Memory Overflow / Out Of Memory, OOM&#xff09;是软件开发中两个密切相关但又本质不同的内存问题&#xff1a; 核心区别一句话概括&#xff1a; 内存泄漏&#xff1a; 有垃圾对象占用内存却无法被回收&…...

Linux系统---Nginx配置nginx状态统计

配置Nignx状态统计 1、下载vts模块 https://github.com/vozlt/nginx-module-vts [rootclient ~]# nginx -s stop [rootclient ~]# ls anaconda-ks.cfg nginx-1.27.3 ceph-release-1-1.el7.noarch.rpm nginx-1.27.3.tar.gz info.sh …...

linux操作系统的软件架构分析

一、linux操作系统的层次结构 1.内核的主要功能 1&#xff09;进程管理 2&#xff09;内存管理 3&#xff09;文件系统 4&#xff09;进程间通信、I/O系统、网络通信协议等 2.系统程序 1&#xff09;系统接口函数库&#xff0c;比如libc 2)shell程序 3&#xff09;编译器、编辑…...

快速手搓一个MCP服务指南(三):FastMCP的核心组件-构建MCP服务的关键技术实现

FastMCP 是一套面向 LLM 应用开发的工具框架&#xff0c;通过标准化协议衔接大语言模型与外部功能组件&#xff0c;构建「LLM工具」的闭环交互体系。其核心技术体系包含四大模块&#xff1a;工具系统将 Python 函数转化为 LLM 可调用的能力单元&#xff0c;通过类型注解实现参数…...

创建首个 Spring Boot 登录项目

&#x1f4cc; 摘要 在 Java Web 开发中&#xff0c;登录功能是最基础也是最重要的模块之一。本文将手把手带你使用 IntelliJ IDEA 和 Maven 构建一个基于 Spring Boot 的简单登录系统&#xff0c;涵盖&#xff1a; 使用 IDEA 创建 Spring Boot 项目配置 Maven 依赖&#xff…...

order、sort、distribute和cluster by(Spark/Hive)

1. abstract ORDER BY&#xff1a;完整查询结果的全局行排序。与SORT BY、CLUSTER BY、DISTRIBUTE BY互斥&#xff0c;不能同时使用。 示例SELECT * FROM table_name ORDER BY column_name;SORT BY&#xff1a;只在每个分区内排序&#xff0c;局部排序结果不是全局有序。与ORD…...

# Python中等于号的使用

# Python中等于号的使用 ## 1. 问题的分析与思考 在Python中&#xff0c;等于号&#xff08;&#xff09;是一个赋值运算符&#xff0c;用于将右侧的值或表达式的结果赋给左侧的变量。这是Python&#xff08;以及许多其他编程语言&#xff09;中非常基础且核心的一个概念。理…...

无人机神经网络模块运行与技术难点

一、神经网络模块的运行方式 1. 分层处理架构 感知层 多模态数据融合&#xff1a;通过八元数卷积网络&#xff08;OCNN&#xff09;统一处理LiDAR、摄像头、IMU等异构传感器数据&#xff0c;将点云坐标&#xff08;x/y/z&#xff09;、图像RGB与光流信息编码至8维虚部&#…...

宝塔服务器调优工具 1.1(Opcache优化)

第一步&#xff1a;宝塔服务器调优工具 1.1&#xff08;按照下面的参数填写&#xff09; 第二步&#xff1a;路径/www/server/php/80/etc/php.ini 搜索jit jit1235 其中1235根据服务器情况修改 第三步&#xff1a;路径/www/server/php/80/etc/php-cli.ini 搜索 jit1235 其中…...

day041-web集群架构搭建

文章目录 0. 老男孩思想-高薪四板斧1. web集群架构图2. 搭建异地备份服务2.1 服务端-阿里云服务器2.1.1 查看rsync软件包2.1.2 添加rsync配置文件2.1.3 添加虚拟用户2.1.4 创建校验用户密码文件2.1.5 创建备份目录2.1.6 启动服务2.1.7 开放安全组端口2.1.8 发送检查邮件 2.2 客…...

国产化条码类库Spire.Barcode教程:如何使用 C# 读取 PDF 中的条码(两种方法轻松实现)

在 PDF 文档的 .NET 平台处理流程中&#xff0c;使用 C# 读取 PDF 条码 是一项常见需求&#xff0c;特别适用于处理扫描件或电子表单。无论是物流、金融、医疗还是制造行业&#xff0c;PDF 文档中经常包含用于追踪或识别的条码。这些条码可能是嵌入图像&#xff0c;也可能是矢量…...

vue 3 计算器

效果&#xff1a; <template><div class"calculator-container"><div class"calculator"><!-- 显示区域 --><div class"display">{{ formattedDisplay }}</div><!-- 按钮区域 --><div class"…...

CRMEB PHP多门店版v3.2.1系统全开源+Uniapp前端+搭建教程

一.介绍 CRMEB多店版是一款为品牌连锁门店打造的私域电商解决方案&#xff0c;以三大运营模式为核心&#xff0c;助力品牌连锁门店轻松构建全渠道、一体化的私域电商生态&#xff0c;促进“线上电商”与“线下门店”销售运营融合&#xff0c;加速品牌数字化转型&#xff0c;为…...

主机复制文字和文件到 Ubuntu 虚拟机

在 VMware Workstation Pro 16 中复制文字和文件到 Ubuntu 虚拟机&#xff0c;方法如下&#xff1a; Open-VM-Tools 禁用 Wayland 解决 。 1.安装 VMware Tools&#xff08;推荐&#xff09;或 open-vm-tools&#xff1a; sudo apt update sudo apt install open-vm-tools…...

性能测试 —— 数据库的连接池和主从同步和分表分区

一、数据库的调优&#xff08;库层面&#xff09; 1、数据库连接池 1、介绍&#xff1a;数据库连接池(Database Connection Pool)是一种用于管理数据库连接的技术&#xff0c;它通过预先创建并维护一组数据库连接来提高应用程序的性能和可扩展性。 2、创建、管理、关闭 数据…...

猿人学js逆向比赛第一届第十二题

一、分析请求 看到这里只有一个m的密文参数&#xff0c;没有cookie&#xff0c;请求头等其他的参数&#xff0c;那么这里跟一堆栈信息。 很顺利地锁定了m的加密位置。看到是字符串拼接然后使用btoa函数进行编码&#xff0c;那么这里尝试使用Python复现一下。顺利拿到结果。 复现…...

第十节 新特性与趋势-CSS层叠规则升级

以下是关于 ​​CSS层叠规则升级​​ 的全面解析&#xff0c;结合最新规范&#xff08;如级联层layer&#xff09;和传统层叠机制的演进&#xff0c;从核心原理、应用场景到实践策略的系统性总结&#xff1a; 一、传统层叠规则的三大支柱 CSS层叠规则的传统机制基于以下三个维…...

关键领域软件工厂的安全中枢如何全面升级供应链检测能力

随着软件供应链安全体系在互联网、金融等领域逐步成熟&#xff0c;关键领域正加速迈向以 MLOps、软件工厂为核心的新型研发生态。在这一过程中&#xff0c;面对代码安全、依赖合规、系统可信等多重挑战&#xff0c;传统人工审查模式已难以满足国家级高安全性要求。 Gitee Scan…...

西门子G120XA变频器:数据中心能效革命的核心引擎

在数字经济爆发式增长的今天&#xff0c;数据中心已成为支撑社会运转的"数字心脏"。然而&#xff0c;其庞大的能耗需求与绿色低碳目标之间的矛盾日益凸显——尤其是冷却系统作为数据中心第二大能耗单元&#xff08;占比约35%&#xff09;&#xff0c;正成为能效提升的…...

从零开始学习Spring Cloud Alibaba (一)

人狠话不多,直接开始少点屁话本着共同学习进步的目的和大家交流如有不对的地方望铁子们多多谅解 准备工具 开发工具 idea Java环境 jdk17 容器: docker Maven 3.8.6 仓库镜像阿里云 <mirror><id>alimaven</id><name>aliyun maven</name><…...

【C/C++】C++ 编程规范:101条规则准则与最佳实践

C 编程规范&#xff1a;101条规则准则与最佳实践 引言 C 是一门强大而复杂的语言&#xff0c;能高效控制硬件&#xff0c;也能写出优雅抽象。然而&#xff0c;正因其复杂性&#xff0c;项目中若缺乏统一规范&#xff0c;极易陷入混乱、难维护、易出错的泥潭。 本文总结了 10…...

PyTorch topk() 用法详解:取最大值

torch.topk(input, k) 返回张量中最大的 k 个元素以及它们在原张量中的 索引。 函数原型 torch.topk(input, k, dimNone, largestTrue, sortedTrue)参数说明&#xff1a; 参数说明input输入张量k要取出的前 k 个值dim指定沿哪个维度取值&#xff08;默认是最后一维&#xff…...

毕业论文查重原理及降重方法

【30%的重复率有那么重要吗&#xff1f;】 老师说论文重读率必须低于30%&#xff0c;否则无法毕业&#xff01; 如果您在专科或者普通本科学生&#xff0c;我只能这样一句话告诉你&#xff1a;你想多了~&#xff0c; 真的想多了~~~&#xff0c;一篇论文还不至于让你不能毕…...

Golang Kratos 系列:业务分层的若干思考(二)

上一篇文章简单讨论了领域层在Kratos中的使用&#xff0c;主要涉及引入领域层&#xff0c;将数据层和业务层之间的解耦&#xff0c;接下来讨论一个稍微全面一点的例子&#xff0c;在此基础上引入外部Api&#xff08;主要是易变部分&#xff09;的领域层下的情况。 我们同样可以…...

技术伦理之争:OpenAI陷抄袭风波,法院强制下架宣传视频

在AI巨头OpenAI宣布以65亿美元天价收购苹果前设计总监Jony Ive的硬件公司IO仅一个月后&#xff0c;一场抄袭指控将这家科技明星企业推上风口浪尖。 源自谷歌X实验室的初创企业IYO将OpenAI告上法庭&#xff0c;指控其窃取智能耳塞核心技术&#xff0c;并通过巨额收购试图掩盖抄袭…...

烟花爆竹生产企业库房存储安全风险预警系统

烟花爆竹生产企业库房存储安全风险预警系统是保障库房物资安全、规范作业流程、防范安全事故的重要技术手段&#xff0c;涵盖多个关键预警功能。​ 温湿度预警​ 在库房内安装温湿度传感器&#xff0c;这些传感器如同敏锐的“环境感知员”&#xff0c;能够实时监测库房内环境变…...

Jenkins+Jmeter+Ant接口持续集成

2025最新Jmeter接口测试从入门到精通&#xff08;全套项目实战教程&#xff09; 前言&#xff1a; 为什么要用Jmeter做接口测试&#xff1a; 当选择这套方案的时候&#xff0c;很多人会问&#xff0c;为什么选择Jmeter做Case管理&#xff1f;为什么不自己写框架&#xff1f;说…...

基于STM32的寻迹小车设计

标题:基于STM32的寻迹小车设计 内容:1.摘要 本文围绕基于STM32的寻迹小车设计展开。背景是随着自动化技术的发展&#xff0c;寻迹小车在工业巡检、物流运输等领域有广泛应用前景。目的是设计一款能稳定、准确寻迹的小车。方法上&#xff0c;以STM32微控制器为核心&#xff0c;…...

【150】基于SSM+Vue实现的小说阅读小程序(有文档)

系统介绍 基于SSMVue实现的小说阅读小程序采用前后端分离的架构方式&#xff0c;系统设计了管理员、用户两种角色&#xff0c;系统分为管理端、小程序端&#xff0c;管理端实现了管理员登录、个人中心、管理员管理、帮助中心管理、基础数据管理、论坛中心管理、公告资讯管理、…...

ValKey中使用SIMD指令优化bitcount命令

一、AVX/AVX2 的历史演进 随着计算机技术的飞速发展&#xff0c;数据处理需求呈指数级增长&#xff0c;SIMD&#xff08;单指令多数据&#xff09;技术应运而生。它通过一条指令同时处理多个数据元素&#xff0c;大幅提升计算效率&#xff0c;从早期的 MMX 技术起步&#xff0…...

leetcode114-二叉树展开为链表

leetcode 114 思路 用简单例子推导规律 不要一开始就看复杂的树&#xff0c;先从最简单的情况入手 案例一&#xff1a;只有一个节点 输入&#xff1a;1 输出&#xff1a;1不需要任何操作&#xff0c;直接返回 案例二&#xff1a;有两个节点 输入&#xff1a; 1/2输出&a…...

第七章 习题

1.给出下面表达式的逆波兰表示(后缀式): 3请将表达式-(ab)* (cd)-(abc)分别表示成三元式,间接三元式和四元式序列 四元式(Op,arg1,arg2,result) (,a,b,T1) (,c,d,T2) (*,T1,T2,T3) (uminus,T3,-,T4) (,a,b,T5) (,T5,c,T6) (-,T4,T6,r) 三元式 (op,arg1,arg2) (0) (,…...

Spring Ai Alibaba Graph实现五大工作流模式

Spring Ai Alibaba Graph实现五大工作流模式 概述 在 building-effective-agents 一文中,Anthropic将"智能体系统"(agentic systems),从架构层面分为 “工作流”&#xff08;workflows&#xff09;和 “智能体”&#xff08;agents&#xff09;&#xff1a; 工作流…...

基于单片机的语音控制设计(论文)

摘要 自然语音作为人机交互在目前得以广泛的应用以及极大的发展前景。该设计介绍了基于非指定人语音芯片LD3320的语音控制器结构及其实现语音控制的方法。该语音控制器利用STM32F103C8T6单片机作为主要控制器&#xff0c;控制芯片对输入的进行语音识别并处理&#xff0c;根据语…...

【网络安全】从IP头部看网络通信:IPv4、IPv6与抓包工具 Wireshark 实战

从IP头部看网络通信&#xff1a;IPv4、IPv6与抓包工具 Wireshark实战 在网络安全分析和数据通信的世界中&#xff0c;一切都始于“数据包”。数据包是网络上传输的基本单位&#xff0c;而数据包的结构与内容&#xff0c;正是我们理解网络行为的核心。本文将带你深入了解 IP 协…...

计算机组成原理笔记(公众号版本)

1.MAR&#xff0c;存储单元和PC位数之间的关系 我们的MAR位数取决于我们的存储单元的个数&#xff1b; PC位数也是取决于我们的存储单元的个数&#xff1b; 假设我们是64个存储单元&#xff0c;我们的这个MAR实际上就是6位&#xff0c;因为这个2的6次方等于我们的64吗&#…...

CPM基本原理

CPM&#xff08;连续相位调制&#xff0c;Continuous Phase Modulation &#xff09;是一种恒包络&#xff0c;信号相位随时间连续变化的调制技术 。其优势显著&#xff0c;连续相位特性&#xff0c;频谱效率高&#xff0c;对带外辐射抑制好&#xff1b;相位平滑过渡&#xff0…...

浅谈开源在线客服系统与 APP 集成的技术方案与优劣势

在为移动端 App 接入在线客服系统的过程中&#xff0c;我经历了长时间的技术选型探索。最初&#xff0c;我也曾被一些“技术理想主义”选项所吸引&#xff0c;比如让用户自己研发界面我提供 API 以获得最高自由度&#xff0c;或集成 SDK 以追求原生体验。然而&#xff0c;随着项…...

AutoGPT,自主完成复杂任务

AutoGPT是一个开源的AI Agent项目&#xff0c;它的核心目标是让AI能够自主完成复杂任务&#xff0c;而不仅仅是回答单个问题。简单来说&#xff0c;它让AI具备了"自主思考和行动"的能力。 1. AutoGPT的核心概念 什么是AI Agent&#xff1f; AI Agent&#xff08;智…...

基于Qt C++的影像重采样批处理工具设计与实现

摘要 本文介绍了一种基于Qt C++框架开发的高效影像重采样批处理工具。该工具支持按分辨率(DPI) 和按缩放倍率两种重采样模式,提供多种插值算法选择,具备强大的批量处理能力和直观的用户界面。工具实现了影像处理的自动化流程,显著提高了图像处理效率,特别适用于遥感影像处…...

Qt Windows平台调用ffmpeg动态库

本文基于QT6.8实测验证。 一、下载预编译库‌ 从官方或第三方源获取FFmpeg的Windows动态库&#xff08;Shared版本&#xff09;&#xff0c;解压后需包含以下目录&#xff1a; bin   DLL文件&#xff08;运行时依赖&#xff09;include   头文件lib   .lib或.dll.a链接…...

猿人学js逆向比赛第一届第十三题

一、分析请求 通过分析请求得知&#xff0c;本题目的参数为yuanrenxue_cookie&#xff0c;因为题目中中明说了是动态cookie&#xff0c;所以可以先删除这个cookie然后下脚本断点&#xff0c;简单分析看一下页面执行的js代码逻辑。 在经过这段代码的时候很明显的可以看到这里的有…...

React性能优化精髓之一:频繁setState导致滚动卡顿的解决方案

在开发一个 List 页面时&#xff0c;我们遇到了一个典型的React性能问题&#xff1a;页面在滚动时出现明显卡顿。这个问题的调试过程充满了误判和重新思考&#xff0c;最终发现了一个重要的性能优化原则。 问题现象 我们有一个监控仪表盘页面&#xff0c;包含多个图表组件。用…...

JavaScript 事件常用属性

一、事件对象基础 在事件处理函数中&#xff0c;浏览器会自动传入一个 event 对象&#xff0c;它包含了与事件相关的所有信息。 element.addEventListener(click, function(event) {// event 是事件对象 }); 二、常见事件属性 属性名 类型 描述 type String 事件类…...

配置自己的NTP 服务器做时间同步

✅ 推荐方案&#xff1a;使用 chrony 搭建 NTP 服务器&#xff08;适用于 CentOS 7/8/9&#xff09; chrony 是 CentOS 推荐的 NTP 实现&#xff0c;精度高、资源占用低、同步快&#xff0c;默认在 CentOS 8 中取代了 ntpd。 &#x1f527; 一、安装 chrony sudo yum install…...

基于深度学习的双色球智能预测系统:从原理到实现

需要源码的小伙伴可以在这里直接下载&#xff1a;基于深度学习的双色球智能预测系统&#xff1a;从原理到实现&#xff08;完整代码训练数据&#xff09;可直接运行-预测&#xff09;资源-CSDN下载可直接运行&#xff0c;包括完整的训练测试数据&#xff0c;让你的双色球更准&a…...

STM32[笔记]--4.嵌入式硬件基础

4.嵌入式硬件基础 4.1认识上官二号开发板 主控芯片:STM32F103C8T6高速晶振:8M低速晶振:32.768kLED:5颗KEY:3个 主控芯片内部的资源如下项目介绍内核Cortex-M3Flsah64K*8bitSRAM20K*8bitGPIO37个GPIO,分别为PA0-PB15,PC13-PC15,PD0-PD1ADC2个12bitADC合计12了通道,外部通…...

Springboot项目中使用手机号短信验证码注册登录实现

文章目录 1. 功能概述2. 技术栈3. 实现步骤3.1 短信服务集成3.2 创建短信工具类3.3 验证码生成和存储3.4 控制器实现发送短信验证码手机号+验证码注册短信验证码登录3.5 服务层实现4. 前端实现4.1 API层4.2 手机号注册页面5. 最佳实践6. 总结本文将介绍如何在Spring Boot应用中…...

Python的GUI库选择指南(深度拓展)

前文我们分析了python的GUI库&#xff0c;有很多&#xff0c;面向应用场景也不尽相同&#xff0c;如何在使用过程中&#xff0c;选择合适的GUI库呢&#xff1f;可以查看&#xff1a;python有哪些常用的GUI&#xff08;图形用户界面&#xff09;库及选择指南-CSDN博客 初学者推…...