深入了解 Python 面向对象编程(最终篇)
大家好!今天我们将继续探讨 Python 中的类及其在面向对象编程(OOP)中的应用。面向对象编程是一种编程范式,它使用“对象”来模拟现实世界的事务,使代码更加结构化和易于维护。在上一篇文章中,我们详细了解了类和实例的概念、' self ' 关键字的作用、魔法函数的定义、构造函数和析构函数以及面向对象编程的三大特性、抽象类、动态添加内容。而今天,我们将会在原有的基础上学习:数据的三种类型、属性封装以及单例类,让我们开始吧!
一、面向对象编程(OOP)
面向对象编程是一种将现实世界事务使用类与实例来模拟的方法。在 OOP 中,所有事物都被视为对象。这些对象可以是具体的,如:
灯:可以开关的设备。
汽车:具有属性(如颜色、品牌)和行为(如行驶、停车)的交通工具。
导弹:具备特定属性和发射行为的武器。
杯子:用于盛放液体的容器。
通过将这些现实世界的事务抽象为对象,我们可以创建更易于理解和操作的代码结构。
二、类与实例
1. 类
类是对现实世界描述的一种类型。它是一个抽象的概念,约定了未来实例应该有的内容。定义类的基本语法如下:
class 类名:pass
在 Python 中,类名通常采用大驼峰(Pascal Case)命名法。
例如,我们可以定义一个名为' Car ' 的类:
class Car:pass
类是实例的模板,它定义了实例的属性和行为,但并不包含具体的数据。
2. 实例
实例是通过调用类生成的具体对象。生成实例的语法为:
实例名 = 类名()
例如:
my_car = Car()
这里,' my_car ' 是 ' Car ' 类的一个实例,它包含了 ' Car ' 类定义的所有属性和方法,但具体的数据是属于这个实例的。
三、' self ' 关键字
' self ' 关键字在类的方法内部,' self ' 代表实例本身。它用于访问实例的属性和方法。' self ' 必须作为第一个参数出现在类的方法中。让我们看一个简单的例子,展示如何使用 ' self ' :
class Dog:
def __init__(self, name):
self.name = name # 将实例属性name初始化为传入的name参数
def bark(self):
return f"{self.name} says Woof!"
在上面的代码中,' __init__ ' 是一个初始化函数,用于创建实例时初始化属性。通过 ' self ' ,我们可以在 ' bark ' 方法中引用实例的 ' name ' 属性。
四、魔法函数
魔法函数是以双下划线开头和结尾的特殊方法,它们能够实现某些特定的功能。常用的魔法函数包括:
1. 初始化与字符串表示
' __init__(self) ' :构造函数,用于初始化实例。
' __str__(self) ' :定义对象的字符串表示,通常用于 ' print() ' 函数。
class Cat:def __init__(self, name):self.name = namedef __str__(self):return f"This is {self.name} the cat."
2. 长度与比较
' __len__(self) ' :返回对象的长度。
比较运算符魔法函数: ' __eq__(self, other) ':等于比较。
' __ne__(self, other) ':不等于比较。
' __gt__(self, other) ':大于比较。
' __ge__(self, other) ':大于或等于比较。
' __lt__(self, other) ':小于比较。
' __le__(self, other) ':小于或等于比较。
class Box:def __init__(self, size):self.size = sizedef __len__(self):return self.sizedef __eq__(self, other):return self.size == other.size
3. 算术运算
魔法函数还可以重载算术运算符,使得我们能够使用常见的运算符(如 `+`、`-` 等)对自定义对象进行操作。这些魔法函数包括:
' __add__(self, other) ' :实现加法运算。
' __sub__(self, other) ':实现减法运算。
' __mul__(self, other) ':实现乘法运算。
' __truediv__(self, other) ':实现除法运算。
' __mod__(self, other) ':实现取模运算。以下是一个示例,展示如何使用 ' __add__ ' 魔法函数:
class Point:def __init__(self, x, y):self.x = xself.y = ydef __add__(self, other):return Point(self.x + other.x, self.y + other.y)def __repr__(self):return f"Point({self.x}, {self.y})"# 创建两个 Point 实例
p1 = Point(1, 2)
p2 = Point(3, 4)
p3 = p1 + p2 # 这里会调用 p1.__add__(p2)
print(p3) # 输出: Point(4, 6)
在这个例子中,' __add__ ' 方法允许我们直接使用 ' + ' 运算符来相加两个 ' Point ' 实例。
五、构造函数与析构函数
1. 初始化函数
初始化函数是一个特殊的方法,用于初始化实例的属性。' __init__ ' 方法在创建对象时自动调用。
class Person:def __init__(self, name, age):self.name = nameself.age = agedef display(self):return f"姓名: {self.name}, 年龄: {self.age}"# 创建实例
person = Person("Alice", 30)
print(person.display()) # 输出: 姓名: Alice, 年龄: 30
2. 构造函数
构造函数是一个特殊的方法,用于创建实例。' __new__ ' 方法在实例被创建时被调用。通常情况下,我们不需要直接使用 ' __new__ ' ,但在需要控制实例创建过程时可以使用。
class Singleton:_instance = Nonedef __new__(cls):if cls._instance is None:cls._instance = super(Singleton, cls).__new__(cls)return cls._instance# 测试 Singleton 类
s1 = Singleton()
s2 = Singleton()print(s1 is s2) # 输出: True,确保只有一个实例
3. 析构函数
析构函数是另一个特殊的方法,在实例不再使用时被调用,通常用于释放资源。Python 中的析构函数是 ' __del__ ' 方法。虽然 Python 有垃圾回收机制,但在某些情况下,手动释放资源是很有用的。
析构函数的基本结构如下:
def __del__(self):# 清理代码
下面是一个简单的示例,展示如何使用析构函数:
class Resource:def __init__(self):print("Resource acquired!")def __del__(self):print("Resource released!")# 创建一个资源对象
res = Resource()
# 资源会在对象销毁时被释放
当 ' res ' 对象超出作用域时,Python 的垃圾回收会调用 ' __del__ ' 方法,输出“Resource released!”。
六、面向对象编程的三大特性
在 OOP 中,有三大基本特性:封装、继承和多态。
1. 封装
封装是指将数据和方法结合在一起,并限制对某些数据的直接访问。通过封装,我们可以保护对象的内部状态,只通过公共方法(接口)来访问和修改这些状态。
class Person:def __init__(self, name, age):self.__name = name # 私有属性self.__age = age # 私有属性def get_name(self):return self.__namedef set_name(self, name):self.__name = namedef get_age(self):return self.__agedef set_age(self, age):if age > 0:self.__age = ageelse:print("年龄必须为正数!")# 创建实例
person = Person("Alice", 30)
print(person.get_name()) # 输出: Alice
person.set_age(-5) # 输出: 年龄必须为正数!
在上面的代码中,我们使用了双下划线 ' __ ' 将实例属性 ' __name ' 和 ' __age ' 定义为私有属性,这样它们就不能被直接访问。我们提供了公共方法 ' get_name ' 和 ' set_name ' 来访问和修改这些私有属性。这种封装机制不仅保护了对象的内部状态,还提供了更好的数据验证和控制。
2. 继承
继承是指一个类(子类)可以继承另一个类(父类)的属性和方法,从而实现代码的重用。子类可以扩展或修改父类的行为。
class Animal:def speak(self):return "Animal speaks"class Dog(Animal): # Dog 继承自 Animaldef speak(self):return "Woof!"class Cat(Animal): # Cat 也继承自 Animaldef speak(self):return "Meow!"# 实例化对象
dog = Dog()
cat = Cat()
print(dog.speak()) # 输出: Woof!
print(cat.speak()) # 输出: Meow!
在这个例子中,' Dog ' 和 ' Cat ' 类都继承了 ' Animal ' 类的 ' speak ' 方法,但它们各自实现了自己的版本。这种特性使得我们可以创建一个通用的父类,并根据需要扩展子类。
多重继承
Python 支持多重继承,即一个类可以同时继承多个类。这在某些情况下非常有用,但也可能导致复杂性(如菱形继承问题)。
class Flyer:def fly(self):return "Flying"class Swimmer:def swim(self):return "Swimming"class Duck(Flyer, Swimmer):def quack(self):return "Quack!"# 实例化 Duck
duck = Duck()
print(duck.fly()) # 输出: Flying
print(duck.swim()) # 输出: Swimming
print(duck.quack()) # 输出: Quack!
3. 多态
多态是指不同类的对象可以通过相同的接口进行操作。多态的实现通常依赖于继承和方法重载。Python 中的多态通常有两种形式:
1. 方法重载(函数同名不同参数)
Python 不支持传统意义上的方法重载,但我们可以使用可变参数( ' *args ' 和 ' **kwargs ' )来实现类似效果。
class MathOperation:def add(self, *args):return sum(args)math_op = MathOperation()
print(math_op.add(1, 2)) # 输出: 3
print(math_op.add(1, 2, 3, 4, 5)) # 输出: 15
2. 父子类多态
父类和子类的方法名相同,但实现不同。我们可以通过多态来处理不同类型的对象。
def animal_sound(animal):print(animal.speak())# 实例化对象
dog = Dog()
cat = Cat()
animal_sound(dog) # 输出: Woof!
animal_sound(cat) # 输出: Meow!
在这个例子中,' animal_sound ' 函数接收 ' Animal ' 类型的对象,不论是 ' Dog ' 还是 ' Cat ',都可以调用 ' speak ' 方法。
七、抽象类
抽象类是一种特殊的类,用于定义接口并强制子类实现特定的方法。抽象类不能被实例化,通常用于提供一个模板,要求其子类实现抽象方法。使用 `abc` 模块来定义抽象类和抽象方法。
from abc import ABC, abstractmethodclass Animal(ABC): # 继承自 ABC,表示这是一个抽象类@abstractmethoddef speak(self): # 抽象方法passclass Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"# 实例化对象
dog = Dog()
cat = Cat()
print(dog.speak()) # 输出: Woof!
print(cat.speak()) # 输出: Meow!# animal = Animal() # 这将引发错误,因为不能实例化抽象类
在这个示例中,' Animal ' 是一个抽象类,定义了一个抽象方法 ' speak ' 。子类 ' Dog ' 和 ' Cat ' 必须实现这个方法,否则会引发错误。抽象类的使用使得接口的实现变得一致,并确保所有子类都具备特定的方法。
八、动态添加内容
Python 是一门动态语言,允许我们在运行时向类和实例添加属性和方法。这种灵活性使得 Python 在许多场景下非常强大。
1. 添加实例属性我们可以在实例创建后直接为实例添加新的属性。
class Cup:def __init__(self, capacity):self.capacity = capacity# 创建实例
my_cup = Cup(300)
my_cup.color = "Blue" # 动态添加实例属性
print(my_cup.color) # 输出: Blue
在这个例子中,我们创建了一个 ' Cup ' 类的实例 ' my_cup ' ,然后动态地为其添加了一个'color' 属性。
2. 添加实例方法
可以使用 ' types.MethodType ' 动态添加实例方法。注意,动态添加的方法的第一个参数必须是 ' self '。
import typesdef new_method(self):return f"This cup has a capacity of {self.capacity} ml."my_cup.new_method = types.MethodType(new_method, my_cup) # 动态添加实例方法
print(my_cup.new_method()) # 输出: This cup has a capacity of 300 ml.
在这个例子中,我们定义了一个新的方法 ' new_method ' ,然后使用 ' types.MethodType ' 将其动态添加到 ' my_cup ' 实例中。
3. 添加类属性和方法
同样地,我们可以向类本身动态添加属性和方法。
Cup.color = "Red" # 动态添加类属性
print(Cup.color) # 输出: Reddef class_method(cls):return f"This class has the capacity: {cls.color}"Cup.class_method = classmethod(class_method) # 动态添加类方法
print(Cup.class_method()) # 输出: This class has the capacity: Red
在这个例子中,我们为 ' Cup ' 类添加了一个类属性 ' color ' 和一个类方法 ' class_method ',并可以通过类名直接访问它们。
九、数据的访问级别
在 Python 中,属性和方法可以有不同的访问级别,主要分为公有、私有和保护类型。
1. 公有类型
公有属性和方法是最常见的,普通命名方式可以在类内和类外被直接访问。
class PublicExample:def __init__(self):self.public_value = "I am public!"example = PublicExample()
print(example.public_value) # 输出: I am public!
2. 私有类型
私有属性和方法以 ' __ ' 开头,只能在类内访问,外部无法直接访问。这种机制用于保护类的内部实现。
class PrivateExample:def __init__(self):self.__private_value = "I am private!"def get_private_value(self):return self.__private_valueexample = PrivateExample()
print(example.get_private_value()) # 输出: I am private!
# print(example.__private_value) # 会引发 AttributeError
3. 保护类型
保护属性和方法以 ' _ ' 开头,可以在类内和子类中访问,但在类外不能直接访问。这是一种建议性约定,表示属性不应被外部直接访问。
class ProtectedExample:def __init__(self):self._protected_value = "I am protected!"example = ProtectedExample()
print(example._protected_value) # 输出: I am protected!
十、属性封装
属性封装是指通过 ' property ' 装饰器来控制对属性的访问。这种机制允许我们在获取或设置属性时添加逻辑。
1. 使用 ' property '
通过 ' property ' 装饰器,我们可以定义 getter 和 setter 方法,从而控制对属性的访问。
class Person:def __init__(self, name, age):self.__name = nameself.__age = age@propertydef name(self):return self.__name@name.setterdef name(self, name):self.__name = name@propertydef age(self):return self.__age@age.setterdef age(self, age):if age > 0:self.__age = ageelse:print("年龄必须为正数!")# 创建实例
person = Person("Alice", 30)
print(person.name) # 输出: Alice
person.age = -5 # 输出: 年龄必须为正数!
在这个示例中,我们通过 ' @property ' 装饰器为 ' name ' 和 ' age ' 属性定义了访问和设置方法,从而实现了属性的封装和数据验证。
十一、单例类
单例类是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。实现单例模式的常用方法是控制类的构造函数,确保在第一次创建实例时生成,并在后续请求时返回该实例。
class Singleton:_instance = Nonedef __new__(cls):if cls._instance is None:cls._instance = super(Singleton, cls).__new__(cls)return cls._instance# 测试 Singleton 类
s1 = Singleton()
s2 = Singleton()print(s1 is s2) # 输出: True,确保只有一个实例
在这个示例中,' Singleton ' 类的 ' __new__ ' 方法确保在第一次请求实例时创建一个新对象,而后续请求则返回这个对象。这样,' s1 ' 和 ' s2 ' 是同一个实例。
十二、总结
通过本篇文章,我们深入了解了 Python 中的类和面向对象编程的基本概念,包括:
1.类与实例:类是对象的模板,实例是具体的对象。类定义了属性和行为,实例则包含具体的数据。
2. ' self ' 关键字:用于引用实例本身,允许在方法中访问实例属性和方法。
3. 魔法函数:特殊的方法,允许我们定义对象的行为(如初始化、比较和运算),包括 '__init__ '、' __str__ ' 、' __len__ ' 等。
4.构造函数与析构函数:用于创建和销毁实例,管理资源。构造函数 ' __new__ ' 和析构函数 '__del__' 使得我们可以控制实例的创建和销毁过程。
5. 面向对象编程的三大特性:
封装:将数据和方法结合在一起,保护对象的内部状态。
继承:允许子类继承父类的属性和方法,促进代码重用。
多态:允许不同类的对象通过相同的接口进行操作,提高代码的灵活性和可扩展性。
6. 抽象类:用于定义接口,强制子类实现特定的方法,提供一致性。
7. 动态添加内容:Python 允许在运行时向类和实例添加属性和方法,增加了编程的灵活性。
8.数据的访问级别:Python 提供公有、私有和保护类型来控制属性的访问。
9. 属性封装:通过 `property` 装饰器控制对属性的访问和修改。
10. 单例模式:确保一个类只有一个实例,并提供全局访问点。
面向对象编程的优势在于它将数据和功能封装在一起,使代码更加模块化、可读且易于维护。这种结构不仅有助于我们更好地组织代码,还能提高开发效率。
希望通过本篇文章,您对 Python 的面向对象编程有了更深入的了解!如果您有任何问题或想进一步讨论的内容,请随时在评论区留言。感谢您的阅读,我们下次再见!
相关文章:
深入了解 Python 面向对象编程(最终篇)
大家好!今天我们将继续探讨 Python 中的类及其在面向对象编程(OOP)中的应用。面向对象编程是一种编程范式,它使用“对象”来模拟现实世界的事务,使代码更加结构化和易于维护。在上一篇文章中,我们详细了解了…...

手把手教你实现基于丹摩智算的YoloV8自定义数据集的训练、测试。
摘要 DAMODEL(丹摩智算)是专为AI打造的智算云,致力于提供丰富的算力资源与基础设施助力AI应用的开发、训练、部署。 官网链接:https://damodel.com/register?source6B008AA9 平台的优势 💡 超友好! …...
SSH相关
前言 这篇是K8S及Rancher部署的前置知识。因为项目部署测试需要,向公司申请了一个虚拟机做服务器用。此前从未接触过服务器相关的东西,甚至命令也没怎么接触过(接触最多的还是git命令,但我日常用sourceTree)。本篇SSH…...

mysql超大分页问题处理~
大家好,我是程序媛雪儿,今天咱们聊mysql超大分页问题处理。 超大分页问题是什么? 数据量很大的时候,在查询中,越靠后,分页查询效率越低 例如 select * from tb_sku limit 0,10; select * from tb_sku lim…...

Gitlab以及分支管理
一、概述 Git 是一个分布式版本控制系统,用于跟踪文件的变化,尤其是源代码的变化。它由 Linus Torvalds 于 2005 年开发,旨在帮助管理大型软件项目的开发过程。 二、Git 的功能特性 Git 是关注于文件数据整体的变化,直接会将文件…...

探索Axure在数据可视化原型设计中的无限可能
在当今数字化浪潮中,产品设计不仅关乎美观与功能的平衡,更在于如何高效、直观地传达复杂的数据信息。Axure RP,作为原型设计领域的佼佼者,其在数据可视化原型设计中的应用,正逐步揭开产品设计的新篇章。本文将从多个维…...

Redis 内存淘汰策略
Redis 作为一个内存数据库,必须在内存使用达到配置的上限时采取策略来处理新数据的写入需求。Redis 提供了多种内存淘汰策略(Eviction Policies),以决定在内存达到上限时应该移除哪些数据。...

逆天!吴恩达+OpenAI合作出了大模型课程!重磅推出《LLM CookBook》中文版
吴恩达老师与OpenAI合作推出的大模型系列教程,从开发者在大型模型时代的必备技能出发,深入浅出地介绍了如何基于大模型API和LangChain架构快速开发出结合大模型强大能力的应用。 这些教程非常适合开发者学习,以便开始基于LLM实际构建应用程序…...
uint16_t、uint32_t类型数据高低字节互换
1. 使用位运算和逻辑运算符实现 #include<stdio.h> #include<stdint.h> int main() {void test_3() {uint16_t version = 0x1234;printf("%#x\n",(uint8_t)version);printf("%#x\n", version>>8);/*** 在C语言中,uint16和uint8是无符号…...

Java实现数据库图片上传(包含从数据库拿图片传递前端渲染)-图文详解
目录 1、前言: 2、数据库搭建 : 建表语句: 3、后端实现,将图片存储进数据库: 思想: 找到图片位置(如下图操作) 图片转为Fileinputstream流的工具类(可直接copy&#…...

开放式耳机原理是什么?通过不入耳的方式,享受健康听音体验
在开放式耳机的领域又细分了骨传导和气传导两种类型的耳机, 气传导开放式耳机原理 气传导是传统的声音传递方式,它依赖于空气作为声音传播的介质。 声源输入:与普通开放式耳机相同,音频设备通过耳机线将电信号传递到耳机。 驱动…...

有趣的PHP小游戏——猜数字
猜数字 这个游戏会随机生成一个1到100之间的数字,然后你需要猜测这个数字是什么。每次你输入一个数字后,程序会告诉你这个数字是“高了”还是“低了”,直到你猜对为止! 使用指南: 代码如下,保存到一个php中:如 index.php。代码部署到PHP服务器,比如 phpstudy。运行网…...
logstash 全接触
简述什么是Logstash ? Logstash是一个开源的集中式事件和日志管理器。它是 ELK(ElasticSearch、Logstash、Kibana)堆栈的一部分。在本教程中,我们将了解 Logstash 的基础知识、其功能以及它具有的各种组件。 Logstash 是一种基于…...

Windows本地构建镜像推送远程仓库
下载 Docker Desktop https://smartidedl.blob.core.chinacloudapi.cn/docker/20210926/Docker-win.exe 使用本地docker构建镜像和推送至远程仓库(harbor) 1、开启docker的2375端口 2、配置远程仓库push镜像可以通过http harbor.soujer.com:5000ps&am…...

计算机毕业设计LSTM+Tensorflow股票分析预测 基金分析预测 股票爬虫 大数据毕业设计 深度学习 机器学习 数据可视化 人工智能
|-- 项目 |-- db.sqlite3 数据库相关 重要 想看数据,可以用navicat打开 |-- requirements.txt 项目依赖库,可以理解为部分技术栈之类的 |-- data 原始数据文件 |-- data 每个股票的模型保存位置 |-- app 主要代码文件夹 | |-- mod…...

最新版上帝粒子The God Particle(winmac),Cradle Complete Bundle 2024绝对可用
一。Cradle插件套装Cradle Complete Bundle 2024 Cradle 是一家音乐技术公司,致力于为个人提供所需的工具,使他们成为最好的音乐人。自发布我们的第一款插件 The Prince 以来,我们一直致力于不懈地打造可靠、有益且易于使用的产品,…...
数 据 库
数据库是什么? 如何按照和移植数据库? 如何在命令行使用SQL语句操作数据库? 如何在C / C程序中操作数据库? 1. 数据库是什么? 数据库...

智能城市管理系统设计思路详解:集成InfluxDB、Grafana和MQTTx协议(代码示例)
引言 随着城市化进程的加快,城市管理面临越来越多的挑战。智能城市管理系统的出现,为城市的基础设施管理、资源优化和数据分析提供了现代化的解决方案。本文将详细介绍一个基于开源技术的智能城市管理系统,涵盖系统功能、技术实现、环境搭建…...
CloseableHttpClient.close() 导致 Connection pool shut down 的问题
TL;DR; CloseableHttpClient.close() 方法默认行为是关闭 HttpClientConnectionManager如果多个 CloseableHttpClient 共用了同一个 HttpClientConnectionManager,则第一个请求执行完,其他请求就会爆 Connection pool shut down 异常备注:ht…...

centos7 docker空间不足
今天在使用docker安装镜像的时候,出现报错 查看原因,发现是分区空间不足导致的 所以考虑进行扩容 首先在vmware扩容并没有生效 因为只是扩展的虚拟空间,并不支持扩展分区大小,下面对分区进行扩容 参考: 分区扩容 主…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...