青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用
青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用
- 一、类
- 类的定义和使用示例
- 二、定义
- 1. 类定义语法
- 2. 属性和方法
- 3. 构造器和初始化
- 4. 实例化
- 5. 类变量和实例变量
- 6. 类方法和静态方法
- 7. 继承
- 8. 多态
- 总结
- 三、使用
- 1. 创建类的实例
- 2. 访问属性
- 3. 调用方法
- 4. 修改属性
- 5. 使用类方法和静态方法
- 6. 继承
- 7. 多态
- 8. 抽象类和接口
- 9. 属性装饰器
- 四、继承
- 1. 继承的语法
- 2. 调用基类的构造器
- 3. 方法重写
- 4. 访问基类的属性和方法
- 5. 方法解析顺序(MRO)
- 6. 多重继承
- 7. 菱形继承和钻石继承
- 8. 抽象基类(ABCs)
- 五、多态
- 1. 方法重写(Method Overriding)
- 2. 鸭子类型(Duck Typing)
- 多态的好处
- 注意事项
- 六、练习
课题摘要:本文详细介绍了Python中类的基本概念、定义、使用和继承。类是创建对象的蓝图,具有封装、继承、多态和抽象的特点。文章解释了如何定义类、创建实例、访问和修改属性、调用方法,并讨论了类变量、实例变量、类方法、静态方法和继承的概念。此外,还探讨了多态性,包括方法重写和鸭子类型,以及如何使用抽象基类(ABCs)来定义接口。最后,通过一个综合示例程序,展示了类的不同特性和用法,包括继承、多态、封装、方法重写、类方法、静态方法和属性装饰器。这个全面的指南为理解和应用Python中的面向对象编程提供了坚实的基础。
一、类
在Python语言中,类(Class)是一种用户定义的引用类型,它用于创建对象(Object)。类可以被看作是对象的蓝图或模板,它定义了对象的属性(变量)和方法(函数)。通过类,我们可以创建多个具有相同属性和方法的对象实例。
以下是类的一些关键特点:
-
封装(Encapsulation):
- 类可以将数据(属性)和行为(方法)封装在一起,形成一个单一的单元。
- 通过使用私有属性(以双下划线
__开头)和保护属性(以单下划线_开头),类可以实现对内部状态的隐藏和访问控制。
-
继承(Inheritance):
- 类可以实现继承,这意味着一个类(子类)可以继承另一个类(父类)的属性和方法。
- 继承支持代码重用,并允许创建基于现有类的新类。
-
多态(Polymorphism):
- 多态允许不同的对象对同一消息做出响应,即同一个方法调用可以有不同的行为。
- 在Python中,多态通常是通过方法重写(子类覆盖父类的方法)和鸭子类型(duck typing)来实现的。
-
抽象(Abstraction):
- 类可以提供抽象的接口,隐藏复杂的实现细节,只暴露必要的操作。
- Python中的抽象基类(Abstract Base Classes, ABCs)允许定义不能被直接实例化的抽象类。
-
实例化(Instantiation):
- 通过类定义,我们可以创建多个对象实例,每个实例都有自己的状态和行为。
-
构造器和析构器:
- 类可以定义特殊的方法
__init__()作为构造器,用于初始化新创建的对象。 - 类还可以定义
__del__()作为析构器,用于在对象被销毁时执行清理操作。
- 类可以定义特殊的方法
类的定义和使用示例
class Dog:def __init__(self, name, age): # 构造器self.name = nameself.age = agedef bark(self): # 方法return "Woof!"def get_info(self): # 方法return f"My name is {self.name} and I am {self.age} years old."# 创建Dog类的实例
my_dog = Dog("Buddy", 3)
print(my_dog.bark()) # 输出: Woof!
print(my_dog.get_info()) # 输出: My name is Buddy and I am 3 years old.
在这个示例中,Dog是一个类,它有两个属性(name和age)和三个方法(__init__、bark和get_info)。我们使用Dog类创建了一个名为my_dog的对象,并调用了它的方法。
类是Python中实现面向对象编程的核心概念,它们提供了一种强大的方式,用于组织代码、封装数据和创建可重用的对象。
二、定义
在Python中,类是面向对象编程的基本构建块,用于创建具有特定属性和行为的对象。类的定义涉及以下几个关键组成部分:
1. 类定义语法
类的定义以关键字class开始,后跟类名和一对圆括号,圆括号内可以指定父类(用于继承)。类体在缩进的块中定义。
class ClassName:# 类体pass
2. 属性和方法
-
属性:类的属性是与类相关联的数据。它们可以是类变量(所有实例共享)或实例变量(每个实例独有)。
-
方法:类的方法是属于类的对象,它们定义了可以对类的对象执行的操作。方法的第一个参数总是
self,它代表类的实例本身。
3. 构造器和初始化
__init__方法是一个特殊的方法,称为类的构造器。当新对象被创建时,它会自动被调用,用于初始化新对象的状态。
class Person:def __init__(self, name, age):self.name = name # 实例变量self.age = age
4. 实例化
使用类定义,可以创建类的实例,这些实例是具有独立状态的对象。
person = Person("Alice", 30)
5. 类变量和实例变量
- 类变量:在类定义中直接定义的变量,由类的所有实例共享。
class Person:species = 'Homo sapiens' # 类变量def __init__(self, name, age):self.name = name # 实例变量self.age = age
- 实例变量:在
__init__方法中定义的变量,每个实例都有自己独立的副本。
6. 类方法和静态方法
- 类方法:使用
@classmethod装饰器定义,第一个参数是类本身(通常命名为cls)。
class Person:@classmethoddef create_new(cls, name, age):return cls(name, age)
- 静态方法:使用
@staticmethod装饰器定义,它们不接收类或实例的隐式参数。
class Person:@staticmethoddef greet(name):return f"Hello, {name}!"
7. 继承
子类可以通过继承父类的属性和方法来扩展功能。
class Employee(Person): # 继承Person类def __init__(self, name, age, job_title):super().__init__(name, age) # 调用父类的构造器self.job_title = job_title
8. 多态
多态允许不同的对象对同一方法调用做出响应,这在Python中通常是通过方法重写实现的。
总结
类是Python中创建对象的蓝图,它们封装了数据和行为,支持继承、封装、多态和抽象等面向对象编程的基本概念。通过定义类,我们可以创建具有特定属性和行为的对象,从而构建复杂的程序结构。
三、使用
类的使用涉及到创建类、实例化对象、调用方法、访问属性以及利用继承和多态等面向对象编程的特性。以下是类的使用的一些关键方面:
1. 创建类的实例
一旦定义了一个类,就可以创建其实例,这些实例也被称为对象。
class Car:def __init__(self, make, model):self.make = makeself.model = model# 创建Car类的实例
my_car = Car("Toyota", "Corolla")
2. 访问属性
可以通过对象访问其属性。
# 访问属性
print(my_car.make) # 输出: Toyota
print(my_car.model) # 输出: Corolla
3. 调用方法
可以调用对象的方法来执行某些操作。
class Car:def __init__(self, make, model):self.make = makeself.model = modeldef start_engine(self):print("Engine started.")# 调用方法
my_car.start_engine() # 输出: Engine started.
4. 修改属性
可以修改对象的属性。
# 修改属性
my_car.model = "Camry"
print(my_car.model) # 输出: Camry
5. 使用类方法和静态方法
类方法和静态方法是类的一部分,但它们不需要对象实例就可以调用。
class Car:color = "Red" # 类变量@classmethoddef get_color(cls):return cls.color@staticmethoddef is_vehicle():return True# 调用类方法和静态方法
print(Car.get_color()) # 输出: Red
print(Car.is_vehicle()) # 输出: True
6. 继承
可以通过继承来创建新的类,继承可以是单继承或多继承。
class Vehicle:def __init__(self, wheels):self.wheels = wheelsclass Car(Vehicle): # Car继承自Vehicledef __init__(self, wheels, make, model):super().__init__(wheels)self.make = makeself.model = modelmy_car = Car(4, "Toyota", "Corolla")
print(my_car.wheels) # 输出: 4
7. 多态
多态允许子类重写父类的方法。
class Animal:def speak(self):raise NotImplementedError("Subclasses must implement this method")class Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"# 多态的使用
animals = [Dog(), Cat()]
for animal in animals:print(animal.speak())
# 输出: Woof!
# Meow!
8. 抽象类和接口
可以使用抽象基类(ABCs)来定义接口。
from abc import ABC, abstractmethodclass Shape(ABC):@abstractmethoddef area(self):passclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius ** 2# 使用抽象类
circle = Circle(5)
print(circle.area()) # 输出: 78.5
9. 属性装饰器
可以使用@property装饰器来创建只读属性或需要验证的属性。
class Car:def __init__(self, make, model):self._make = makeself._model = model@propertydef make(self):return self._make@make.setterdef make(self, value):if len(value) < 1:raise ValueError("Make must not be empty")self._make = value# 使用属性装饰器
my_car = Car("Toyota", "Corolla")
print(my_car.make) # 输出: Toyota
my_car.make = "Honda" # 更新make属性
print(my_car.make) # 输出: Honda
类的使用是面向对象编程的核心,它允许我们创建灵活、可重用和模块化的代码。通过类的实例化和方法的调用,我们可以在程序中模拟现实世界的对象和行为。
四、继承
类的继承是面向对象编程中的一个核心概念,它允许我们基于一个现有的类创建一个新的类,这个过程称为派生。派生类(子类)继承了基类(父类)的属性和方法,并且可以添加新的属性和方法,或者修改继承的方法。
以下是类继承的一些关键点:
1. 继承的语法
在Python中,继承通过在类定义时在圆括号内指定基类来实现。
class BaseClass:passclass DerivedClass(BaseClass):pass
在这个例子中,DerivedClass继承了BaseClass。
2. 调用基类的构造器
在派生类中,可以使用super()函数来调用基类的构造器。
class BaseClass:def __init__(self, value):self.value = valueclass DerivedClass(BaseClass):def __init__(self, value, additional_value):super().__init__(value) # 调用基类的构造器self.additional_value = additional_value
3. 方法重写
派生类可以重写基类的方法,以提供特定的实现。
class BaseClass:def show(self):print("Base class method")class DerivedClass(BaseClass):def show(self):print("Derived class method")
4. 访问基类的属性和方法
派生类可以访问基类的公共属性和方法。
base = BaseClass()
base.value # 访问基类的属性derived = DerivedClass(10, 20)
derived.value # 访问继承的属性
derived.show() # 调用重写的方法
5. 方法解析顺序(MRO)
Python使用C3线性化算法来确定方法解析顺序(Method Resolution Order,MRO),这是一种确定多个继承时方法调用顺序的算法。
class A:passclass B(A):passclass C(A):passclass D(B, C):passprint(D.mro()) # 输出D的MRO,显示方法调用的顺序
6. 多重继承
Python支持多重继承,即一个派生类可以继承多个基类。
class A:def method(self):print("Method from A")class B:def method(self):print("Method from B")class C(A, B):passc = C()
c.method() # 根据MRO,将调用A中的方法
7. 菱形继承和钻石继承
当多个基类有共同的祖先时,会出现菱形继承或钻石继承的问题,Python通过MRO来解决这个问题。
8. 抽象基类(ABCs)
Python提供了abc模块,允许定义抽象基类,这些类不能被直接实例化,但可以强制派生类实现某些方法。
from abc import ABC, abstractmethodclass Base(ABC):@abstractmethoddef method(self):passclass Derived(Base):def method(self):print("Implemented method")
在这个例子中,Base是一个抽象基类,它要求任何派生类都必须实现method方法。
类的继承是代码重用的强大工具,它允许我们创建一个层次化的结构,使得代码更加模块化和易于维护。然而,过度使用继承或不当使用继承可能会导致代码结构复杂和难以理解,因此应该谨慎使用。
五、多态
类的多态(Polymorphism)是面向对象编程中的一个核心概念,它指的是同一个操作作用于不同的对象时,可以有不同的解释和不同的行为。多态性使得同一个方法调用可以应用于不同的对象,并且根据对象的实际类型来执行不同的代码。
在Python中,多态主要通过以下两种方式实现:
1. 方法重写(Method Overriding)
子类可以重写从父类继承来的方法,以提供特定的实现。
class Animal:def speak(self):raise NotImplementedError("Subclasses must implement this method")class Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"# 多态的使用
def animal_sound(animal):print(animal.speak())dog = Dog()
cat = Cat()animal_sound(dog) # 输出: Woof!
animal_sound(cat) # 输出: Meow!
在这个例子中,Animal类定义了一个speak方法,Dog和Cat类分别重写了这个方法。函数animal_sound接受一个Animal类型的对象,并调用其speak方法,根据传入的对象类型,输出不同的声音。
2. 鸭子类型(Duck Typing)
Python是一种动态类型语言,它采用了鸭子类型的概念,即“如果它看起来像鸭子,游起来像鸭子,那么它就是鸭子”。这意味着只要一个对象有正确的方法或属性,它就可以在需要该方法或属性的地方使用,而不管它实际上是什么类型。
class Duck:def quack(self):return "Quack!"class Person:def quack(self):return "I'm not a duck, but I quack like one!"def perform_quack(bird):print(bird.quack())duck = Duck()
person = Person()perform_quack(duck) # 输出: Quack!
perform_quack(person) # 输出: I'm not a duck, but I quack like one!
在这个例子中,Duck和Person类都有一个quack方法,因此都可以传递给perform_quack函数,即使Person并不是Duck的子类。
多态的好处
- 代码的可扩展性:多态允许你添加新的类,而不需要修改使用这些类的代码。
- 代码的可维护性:多态减少了代码的重复,使得代码更加简洁和易于维护。
- 解耦:多态使得函数或方法不需要知道对象的具体类型,只需要知道它们有正确的接口。
注意事项
- 多态依赖于公共接口,因此确保所有相关类都实现了必要的方法是很重要的。
- 在Python中,由于动态类型的特性,需要小心处理类型检查和错误处理。
多态是面向对象编程中的一个重要特性,它提供了灵活性和强大的代码重用能力,使得代码更加通用和灵活。
六、练习
下面是一个示例程序,它体现了类的多个方面,包括类的继承、多态、封装、方法重写、类方法、静态方法和属性装饰器。
from abc import ABC, abstractmethod# 抽象基类,定义了一个接口
class Animal(ABC):def __init__(self, name):self.name = name@abstractmethoddef speak(self):pass# 具体类,继承自Animal并实现speak方法
class Dog(Animal):def speak(self):return f"{self.name} says: Woof!"# 另一个具体类,继承自Animal并实现speak方法
class Cat(Animal):def speak(self):return f"{self.name} says: Meow!"# 另一个抽象类,继承自Animal
class WildAnimal(Animal):@abstractmethoddef hunt(self):pass# 继承自WildAnimal的具体类
class Lion(WildAnimal):def speak(self):return f"{self.name} says: Roar!"def hunt(self):return f"{self.name} is hunting."# 包含类方法和静态方法的类
class MathTools:@classmethoddef add(cls, a, b):return a + b@staticmethoddef multiply(a, b):return a * b# 使用属性装饰器的类
class Car:def __init__(self, make, model):self._make = makeself._model = model@propertydef make(self):return self._make@make.setterdef make(self, value):if not value:raise ValueError("Make cannot be empty")self._make = value@propertydef model(self):return self._model@model.setterdef model(self, value):if not value:raise ValueError("Model cannot be empty")self._model = value# 使用这些类
def main():# 多态的体现animals = [Dog("Buddy"), Cat("Whiskers"), Lion("Leo")]for animal in animals:print(animal.speak())# 类方法和静态方法的体现print(MathTools.add(3, 4)) # 输出: 7print(MathTools.multiply(3, 4)) # 输出: 12# 属性装饰器的体现my_car = Car("Toyota", "Corolla")print(f"{my_car.make} {my_car.model}") # 输出: Toyota Corollamy_car.make = "Honda" # 使用属性装饰器设置值print(f"{my_car.make} {my_car.model}") # 输出: Honda Corollaif __name__ == "__main__":main()
这个程序包含了以下几个部分:
-
抽象基类(Animal):定义了一个名为
speak的抽象方法,要求所有继承自Animal的子类都必须实现这个方法。 -
具体类(Dog和Cat):继承自
Animal并重写了speak方法,体现了多态性。 -
另一个抽象类(WildAnimal):继承自
Animal并定义了一个新的抽象方法hunt。 -
继承自WildAnimal的具体类(Lion):实现了
speak和hunt方法。 -
类方法和静态方法(MathTools):展示了类方法和静态方法的使用。
-
属性装饰器(Car):使用
@property装饰器创建了 getter 和 setter 方法,以控制对属性的访问和赋值。
这个程序展示了类的继承、多态、封装、方法重写、类方法、静态方法和属性装饰器等面向对象编程的关键概念。
相关文章:
青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用
青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用 一、类类的定义和使用示例 二、定义1. 类定义语法2. 属性和方法3. 构造器和初始化4. 实例化5. 类变量和实例变量6. 类方法和静态方法7. 继承8. 多态总结 三、使用1. 创建类的实例2. 访问属性3. 调用方法4. 修…...
CosyVoice /F5-TTS /GPT-SoVITS /Fish-Speech 开源语音克隆与文本转语音(TTS)项目的对比整理
四个主流开源语音克隆与文本转语音(TTS)项目的对比整理,基于公开资料与实测反馈总结: 项目CosyVoice F5-TTS GPT-SoVITS Fish-Speech 核心技术双向流式语音合成,支持离线与流式一体化建模基于流匹配的ConvNeXt文本表示…...
MySQL基于binlog和gtid主从搭建方案
MySQL基于binlog和gtid主从搭建方案 一.主库配置 1.1 确认 binlog 是否开启 SHOW VARIABLES LIKE %log_bin%; 1.2 创建日志目录并设置权限 mkdir -p /opt/mysql/log_bin chown -R mysql:mysql /usr/local/mysql chmod -R 755 /usr/local/mysql 1.3 修改 my.cnf 配置文件 …...
5 计算机网络
5 计算机网络 5.1 OSI/RM七层模型 5.2 TCP/IP协议簇 5.2.1:常见协议基础 一、 TCP是可靠的,效率低的; 1.HTTP协议端口默认80,HTTPSSL之后成为HTTPS协议默认端口443。 2.对于0~1023一般是默认的公共端口不需要注册,1024以后的则需…...
Vim跳转文件及文件行结束符EOL
跳转文件 gf 从当前窗口打开那个文件的内容,操作方式:让光标停在文件名上,输入gf。 Ctrlo 从打开的文件返回之前的窗口 Ctrlwf 可以在分割的窗口打开跳转的文件,不过在我的实验不是次次都成功。 统一行尾格式 文本文件里存放的…...
智能理解 PPT 内容,快速生成讲解视频
当我们想根据一版 PPT 制作出相对应的解锁视频时,从撰写解锁词,录制音频到剪辑视频,每一个环节都需要投入大量的时间和精力,本方案将依托于阿里云函数计算 FC 和百炼模型服务,实现从 PPT 到视频的全自动转换࿰…...
【鸿蒙开发】第二十四章 AI - Core Speech Kit(基础语音服务)
目录 1 简介 1.1 场景介绍 1.2 约束与限制 2 文本转语音 2.1 场景介绍 2.2 约束与限制 2.3 开发步骤 2.4 设置播报策略 2.4.1 设置单词播报方式 2.4.2 设置数字播报策略 2.4.3 插入静音停顿 2.4.4 指定汉字发音 2.5 开发实例 3 语音识别 3.1 场景介绍 3.2 约束…...
Java/Kotlin双语革命性ORM框架Jimmer(一)——介绍与简单使用
概览 Jimmer是一个Java/Kotlin双语框架 包含一个革命性的ORM 以此ORM为基础打造了一套综合性方案解决方案,包括 DTO语言 更全面更强大的缓存机制,以及高度自动化的缓存一致性 更强大客户端文档和代码生成能力,包括Jimmer独创的远程异常 …...
番外02:前端八股文面试题-CSS篇
一:CSS基础 1:CSS选择器及其优先级 2:display的属性值及其作用 属性值作用none元素不显示,并且会从文档流中移除block块类型,默认元素为父元素宽度,可设置宽高,换行显示inline行内元素类型&a…...
Redis Copilot:基于Redis为AI打造的副驾工具
我们最近发布了Redis Copilot,以帮助开发者更快地使用Redis构建应用。我们的使命是使应用程序快速运行,并简化构建过程。为此,Redis Copilot作为您的AI助手,能够让您更迅速地完成与Redis相关的任务。您今天就可以在Redis Insight中…...
JavaScript遍历对象的7种方式
注:纯手打,如有错误欢迎评论区交流! 转载请注明出处:https://blog.csdn.net/testleaf/article/details/145523427 编写此文是为了更好地学习前端知识,如果损害了有关人的利益,请联系删除! 本文章…...
如何避免NACK重传风暴
策略 1,10 次 NACK 模块对同一包号的最大请求次数,超过这个最大次数限制,会把该包号移出 nack_list,放弃对该包的重传请求。 策略 2,20 毫秒 NACK 模块每隔 20 毫秒批量处理 nack_list,获取一批请求包号…...
并发工具CountDownLatch、CyclicBarrier、Semaphore
文章目录 学习链接CountDownLatchCountDownLatch类的作用类的主要方法介绍图解await和countDown方法两个典型用法注意点总结示例CountDownLatchDemo1CountDownLatchDemo2CountDownLatchDemo1And2 CyclicBarrierCyclicBarrier循环栅栏CyclicBarrier和CountDownLatch的区别示例Cy…...
十二. Redis 集群操作配置(超详细配图,配截图详细说明)
十二. Redis 集群操作配置(超详细配图,配截图详细说明) 文章目录 十二. Redis 集群操作配置(超详细配图,配截图详细说明)1. 为什么需要集群-高可用性2. 集群概述(及其搭建)3. Redis 集群的使用4. Redis 集群故障恢复5. Redis 集群的 Jedis 开发(使用Java…...
网络工程师 (26)TCP/IP体系结构
一、层次 四层: 网络接口层:TCP/IP协议的最底层,负责网络层与硬件设备间的联系。该层协议非常多,包括逻辑链路和媒体访问控制,负责与物理传输的连接媒介打交道,主要功能是接收数据报,并把接收到…...
TensorFlow域对抗训练DANN神经网络分析MNIST与Blobs数据集梯度反转层提升目标域适应能力可视化...
全文链接:https://tecdat.cn/?p39656 本文围绕基于TensorFlow实现的神经网络对抗训练域适应方法展开研究。详细介绍了梯度反转层的原理与实现,通过MNIST和Blobs等数据集进行实验,对比了不同训练方式(仅源域训练、域对抗训练等&am…...
保姆级教程--DeepSeek部署
以DeepSeek-R1或其他类似模型为例,涵盖环境配置、代码部署和运行测试的全流程: 准备工作 1. 注册 Cloud Studio - 访问 [Cloud Studio 官网](https://cloudstudio.net/),使用腾讯云账号登录。 - 完成实名认证(如需长期使用…...
机器学习之心的创作纪念日
机缘 今天,是我成为创作者的第1460天。 在这段时间里,获得了很大的成长。 虽然日常忙碌但还在坚持创作、初心还在。 日常 创作已经成为我生活的一部分,尤其是在我的工作中,创作是不可或缺的,创作都是核心能力之一。…...
VeryReport和FastReport两款报表软件深度分析对比
在当今数据驱动的商业环境中,报表软件已经成为企业管理和数据分析的重要工具。无论是中小型企业还是大型企业,都需要依赖高效的报表工具来快速生成、分析和展示数据。市面上有许多报表工具,其中VeryReport和FastReport是两款备受关注的报表软…...
libtorch的c++,加载*.pth
一、转换模型为TorchScript 前提:python只保存了参数,没存结构 要在C中使用libtorch(PyTorch的C接口),读取和加载通过torch.save保存的模型( torch.save(pdn.state_dict()这种方式,只保存了…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
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.构…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
