HSP_10章 Python面向对象编程oop_基础部分
文章目录
- P107 类与实例的关系
- 1.类与实例的关系示意图
- 2.类与实例的代码分析
- P109 对象形式和传参机制
- 1. 类与对象的区别和联系
- 2. 属性/成员变量
- 3. 类的定义和使用
- 4. 对象的传递机制
- P110 对象的布尔值
- P111 成员方法
- 1. 基本介绍
- 2. 成员方法的定义和基本使用
- 3.注意事项和使用细节
- P112 Python_self
- 1). self 的基本介绍
- 2). @staticmethod
- 3). self代表当前对象本身
- 4). 当我们通过对象调用方法时,self 会隐式的传入
- 5). 在方法内部,要访问成员变量和成员方法,需要使用self
- P113 对象作为参数传递
- P114 作用域
- P114 构造方法
- 1. 基本介绍
- 2. 构造方法的解读
- 2.1 在初始化对象时,会自动执行_init_方法
- 2.2 在初始化对象时,将传入的参数,自动传递给 init方法
- 2.3 构造方法是py预定义的,名称是__init__,注意init 的前后都有两个
- 3. 构造方法的注意事项和使用细节
- 116 本章练习题
P107 类与实例的关系
1.类与实例的关系示意图
2.类与实例的代码分析
#定义一个猫类。age:name:color是属性,或者称为成员变量
# Cat类就是你自己定义的一个新类型# 定义Cat类
class Cat:
# age:name:color是展性age = None# 年龄属性name = None#名字属性color = None# 颜色展性
# 通过Cat类,创建实例(实例对象/对象)
cat1 = Cat()# 通过对象名.属性名 可以各个属性赋值
cat1.name = "小白"
cat1.age = 2
cat1.color = "白色"print(f"cat1的信息为 name: {cat1.name} age:{cat1.age} color:{cat1.color}")# 小结: 通过以上案例可以更好管理小猫的属性
P109 对象形式和传参机制
1. 类与对象的区别和联系
2. 属性/成员变量
# @Version : 1.0
# @Autuor : Zoran#定义Cat类
class Cat:age=2 #年龄属性name ="小白"#名字属性color ="白色"# 颜色属性
#创建对象
cat1 = Cat()print(f"age: {cat1.age} name:{cat1.name} color: {cat1.color}")cat2 = Cat()cat2.age = 1 # 年龄属性
cat2.name = "小黑" # 名字属性
cat2.color = "黄色" # 颜色属性print(f"age: {cat2.age} name:{cat2.name} color: {cat2.color}")
3. 类的定义和使用
- 如何定义类
- 如何创建对象
- 如何访问属性
4. 对象的传递机制
# 定义Person类
class Person:age = None # 年龄属性name = None # 名字属性p1 = Person()
p1.age = 10
p1.name="小明"
p2 = p1 #把p1赋给了p2,即:让p2指向p1
print(p2.age) #把p1赋给了p2,即:让p2指向p1print(f"p1.name地址: {id(p1.age)} p2.name地址::{id(p2.age)} ")
- 练习题
class Person:age = None # 年龄属性name = None # 名字属性a = Person()
a.age = 10
a.name = "jack"
b = a
print(b.name) # ? "jack"b.age = 200
b = None
print(a.age) # ? 200
print(b.age) # ? Error
P110 对象的布尔值
- Python一切皆为对象,所有对象都有一个布尔值,通过内置函数
bool()
可以获取对象的布尔值 - 下面对象的布尔值为False
- False
- 数值0
- None
- 空字符串
- 空列表
- 空字典
- 空元组
- 空集合
print("---下面对象的布尔值为False---")
print(bool(False))
print(bool(0))
print(bool(""))
print(bool([])) # 空列表
print(bool(())) # 空元组
print(bool({})) # 空字典
print(bool(set())) # 空集合# 因为所有对象都有一个布尔值,有些代码直接使用对象的布尔值判断
content = "helo"
if content:print(f"hi {content}")
else:print("空字符串")
lst = [1,2]
if lst:print(f"lst: {lst}")
else:print("空列表")
P111 成员方法
1. 基本介绍
2. 成员方法的定义和基本使用
- 成员方法的定义
在类中定义成员方法和前面学习过的定义函数,基本是一样的(原理和运行机制是一样),但是还是有点不同(形式上有不同)
# 案例演示
# 定义一个Person类(name, age),完成如下要求:
# 1)添加hi成员方法, 输出"hi,python"
# 2)添加ca101成员方法, 可以计算从1 +..+1000的结果
# 3)添加cal02成员方法, 该方法可以接收一个数n,计算从1 +..+n的结果
# 4)添加get_sum成员方法, 该方法可以计算两个数的和并返回class Person():age = Nonename = Nonedef hi(self):print("hi,python")def cal01(self):for i in range(1,1001):sum +=iprint(f"从1 +..+1000的结果:{sum()}")def cal02(self,n):for i in range(1,n+1):sum +=iprint(f"从1 +..+1000的结果:{sum()}")def get_sum(self, n1,n2):return n1+n2p=Person()
p.hi()
p.cal01()
p.cal02()
p.get_sum(1,2)
3.注意事项和使用细节
- Python 也支持对象动态的添加方法
# 函数
def hi():print("hi, python")#定义类
class Person:name = Noneage = Nonedef ok(self):print("ok()")# 创建了对象p和p2
p = Person()
p2 = Person()#1.动态的给p对象添加方法m1,注意只是针对p对象添加方法
#2. m1是你新增加的方法的名称,由程序员指定名字
#3.即m1方法和函数hi关联起来,当调用m1方法时,会执行hi函数
p.m1 = hi
#调用m1(即hi)
p.m1()
#因为没有动态的给p2添加方法,会报错
p2.m1() # AttributeErrorprint(type(p.m1), type(hi)) # <class 'function'> <class 'function'>
print(type(p.ok)) # <class 'method'>
P112 Python_self
1). self 的基本介绍
#定义类
class Dog:name = "波斯猫"age = 2def info(self,name):print(f"name:{name}")# 通过self.属性名/成员变量print(f"成员变量name:{self.name}")
# 创建了对象p和p2
dog = Dog()
dog.info("加菲猫")
2). @staticmethod
#定义类
class Dog:name = "藏獒"age = 2def info(self,name):print(f"name:{name}")# 通过self.属性名/成员变量print(f"成员变量name:{self.name}")# 静态方法# 张老师解读:# 1. 通过@staticmethod 可以将方法转为静态方法# 2. 如果是一个静态方法可以省略self# 3.@staticmethoddef ok():print("ok()...")
# 创建了对象p和p2
dog = Dog()
dog.info("德牧")Dog.info("哈哈") # 会报错不能这么写
# 调用静态方法
dog.ok()
# 方式2: 通过类名调用
Dog.ok()
3). self代表当前对象本身
class Dog:name = "藏獒"age=2def hi(self):print(f"hi self: {id(self)}")
#self表示当前对象本身#创建对象dog2
dog2 = Dog()
print(f"dog2: {id(dog2)}")
dog2.hi()#创建对象dog3
dog3 = Dog()
print(f"dog3: {id(dog3)}")
dog3.hi()
4). 当我们通过对象调用方法时,self 会隐式的传入
5). 在方法内部,要访问成员变量和成员方法,需要使用self
class Dog:name ="藏獒"age = 2def eat(self):print(f"{self.name} 饿了..") #藏獒饿了..def cry(self, name):print(f"{name} is crying") #金毛 is cryingprint(f"{self.name} is crying") #金毛饿了..self.eat()
#不能直接调用
# eat()
dog = Dog()
# dog.name = "中华田园犬"
dog.cry("金毛")
- 课堂练习题
# ●定义Person类
# 1)里面有name、age属性
# 2)并提供compare_to比较方法,用于判断是否和另一个人相等
# 3)名字和年龄都一样,就返回True,否则返回False
class Person:name = Noneage = None# 名字和年龄都一样,就返回True,否则返回False# def compare_to(self,name,age):# return name == self.name and age == self.agedef compare_to(self, other):return self.name == other.name and self.age == other.age#测试
p1 = Person()
p1.name = 'tim'
p1.age = 3p2 = Person()
p2.name = 'tim'
p2.age = 3print(p1.compare_to(p2))
P113 对象作为参数传递
- 代码分析
# ●定义Person类
# 1)里面有name、age属性
# 2)并提供compare_to比较方法,用于判断是否和另一个人相等
# 3)名字和年龄都一样,就返回True,否则返回False
class Person:name = Noneage = Nonedef f1(person):print(f"②person的地址:{id(person)}")person.name = 'jam'person.age +=1#测试
p1 = Person()p1.name = 'jordan'
p1.age = 21print(f"①p1的地址:{id(p1)} p1.name: {p1.name} p1.age: {p1.age}")f1(p1)
print(f"①p1的地址:{id(p1)} p1.name: {p1.name} p1.age: {p1.age}")
- 对象作为参数传递示意图
P114 作用域
- 在面向对象编程中,主要的变量就是
成员变量(属性
)和局部变量
2、我们说的局部变量,一般是指在成员方法中定义的变量
3、作用域的分类:属性作用域为整个类,比如 Cat类:cry eat 等方法使用属性【举例】
class Cat:name = Noneage = None# n1,n2,result就是局部变量def cal(self,n1,n2):result = n1+ n2print("result: ",result)print("cal()使用属性name",self.name)def cry(self):print("cry()使用属性name",self.name)def eat(self):print("eat()使用属性name", self.name)cat = Cat()cat.cal(10,20)
cat.cry()
cat.eat()cat.name = " zoran"
cat.age = 20cat.cry()
cat.eat()
局部变量
:也就是方法中定义的变量,作用域
只在的方法
中
属性
和局部变量
可以重名
,访问时带上self
,表示访问的属性,没有带self,则是访问局部变量
class Cat:name = Noneage = Nonedef hi(self):name = "皮皮"print(name)print(self.name)cat = Cat()
cat.name = "小美"
cat.hi()
P114 构造方法
1. 基本介绍
2. 构造方法的解读
2.1 在初始化对象时,会自动执行_init_方法
class Person:name = Noneage = None# 构造方法/构造器def __init__():print("__init__执行le",name)self.name = name# 后面的__init()__生效
p1 = Person()
2.2 在初始化对象时,将传入的参数,自动传递给 init方法
class Person:name = Noneage = None# 构造方法/构造器def __init__(self,name,age):print("__init__执行le",name,age)# 解读# 1. 把接收到的name和age赋给属性(name,age)# 2. self 就是你当前创造的对象self.name = nameself.age = agep1 = Person("kobe",20)
print(f"p1.id:{id(p1)}")
print(f"p1的信息:{p1.name}{p1.age}")p2= Person("tim",30)
print(f"p1.id:{id(p2)}")
print(f"p1的信息:{p2.name}{p2.age}")
2.3 构造方法是py预定义的,名称是__init__,注意init 的前后都有两个
3. 构造方法的注意事项和使用细节
1.
init一个类只有一个方法
,即使你写了多个,也只有最后一个生效
class Person:name = Noneage = None# 构造方法/构造器def __init__(self,name,age):print("__init__执行le",name,age)self.name = nameself.age = agedef __init__(self,name):print("__init__执行le",name)self.name = name#报错
# 后面的__init()__生效
p1 = Person("kobe",20)p1 = Person("kobe")
print(f"p1的 name={p1.name} age={p1.age}") # kobe I
- 在Python实现多个构造方法,有兴趣的小伙伴可以百度,这里有一篇文章,可以参考下:https://www.cnblogs.com/kingwz/p/16335499.html
2、python可以
动态的生成对象属性
,代码说明
class Person:# 构造方法/构造器def __init__(self,name,age):print("__init__执行le",name,age)# 将接收到的name和age 赋给 当前对象的name和age属性# Python支持动态生成对象属性self.name = nameself.age = agep1 = Person("tim",30)print(f"p1的 name={p1.name} age={p1.age}") # kobe I
构造方法不能有返回值
,比如,你返回字符串,会报"TypeError:
init()should return None,not’str
116 本章练习题
# # 编写类A01,
# # 定义方法max,实现求某个float列表list =[1.1,2.9,-1.9,67.9]的最大值,并返回# class A01:
# def max(self,my_list):
# return max(my_list)
#
# a = A01()
# list1 = [1.1,2.9,-1.9,67.9]
# print(max(list1))
# 2、编写类Book,定义方法update price,实现更改某本书的价格,
# 具体:如果价格>150,则更改为150,
# 如果价格>100,更改为100,否则不变 homework02.pyclass Book:def __init__(self, name, price):self.name = nameself.price = pricedef update_price(self):if self.price > 150:self.price = 150elif self.price > 100:self.price = 100def info(self):print(f"{self.name} 价格: {self.price}")book = Book("新华字典", 120)
# book.info()
book.update_price()
# book.info()
# 03 定义一个圆类Circle,
# 定义属性:半径,
# 提供显示圆周长功能的方法,
# 提供显示圆面积的方法 homework03.py 3min
import mathclass Circle:radius = Nonedef __init__(self, radius):self.radius = radiusdef area(self): # 面积return math.pi * (self.radius) * (self.radius)def girth(self): # 周长return 2 * math.pi * self.radiusdef info(self):print("圆面积: ",self.area().__round__(2), "圆周长: ",self.girth().__round__(2))circl = Circle(10)
# circl.info()
# 04编程创建一个Cal计算类,
# 在其中定义2个成员变量表示两个操作数,
# 定义四个方法实现求和、差、乘、商(要求除数为0的话,要提示)
# 并创建对象,分别测试 homework04.py
class Cal:x = Noney = Nonedef __init__(self,x,y):self.x = xself.y = ydef addtion(self):return self.x + self.ydef subtraction(self):return self.x - self.ydef multiplication(self):return self.x * self.ydef divison(self):if self.y ==0:return "输入有误,除数不能为0"else:return self.x / self.ydef info (self):print(f"和: {self.addtion()},\n差: {self.subtraction()},\n积: {self.multiplication()},\n商: {self.divison()}")cal = Cal(10,0)
# cal.info()
# 5、定义Music类,
# 里面有音乐名name、
# 音乐时长times属性,
# 并有播放play功能,和返回本身属性信息的方法class Music:name = Nonetimes = Nonedef __init__(self,name,times):self.name = nameself.times = timesdef play(self):print(f"音乐: {self.name}正在播放中,"f"时长为: {self.times} min")def get_info(self):return self.name,self.timesmus = Music("克罗地亚狂想曲",10)
# mus.play()
# print(mus.get_info())
# 06 代码分析题
class Demo:i=100def m(self):self.i += 1 #101j= self.i #101print("i=", self.i)print("j=",j)
# d1 = Demo()
# d2 = d1
# d2.m()
# print(d1.i)
# print(d2.i)
相关文章:

HSP_10章 Python面向对象编程oop_基础部分
文章目录 P107 类与实例的关系1.类与实例的关系示意图2.类与实例的代码分析 P109 对象形式和传参机制1. 类与对象的区别和联系2. 属性/成员变量3. 类的定义和使用4. 对象的传递机制 P110 对象的布尔值P111 成员方法1. 基本介绍2. 成员方法的定义和基本使用3.注意事项和使用细节…...

JavaWeb系列十七: jQuery选择器 上
jQuery选择器 jQuery基本选择器jquery层次选择器基础过滤选择器内容过滤选择器可见度过滤选择器 选择器是jQuery的核心, 在jQuery中, 对事件处理, 遍历 DOM和Ajax 操作都依赖于选择器jQuery选择器的优点 $(“#id”) 等价于 document.getElementById(“id”);$(“tagName”) 等价…...
Gone框架介绍30 - 使用`goner/gin`提供Web服务
gone是可以高效开发Web服务的Golang依赖注入框架 github地址:https://github.com/gone-io/gone 文档地址:https://goner.fun/zh/ 使用goner/gin提供Web服务 文章目录 使用goner/gin提供Web服务注册相关的Goners编写Controller挂载路由路由处理函数io.Rea…...

Lipowerline5.0 雷达电力应用软件下载使用
1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:289…...

STM32学习之一:什么是STM32
目录 1.什么是STM32 2.STM32命名规则 3.STM32外设资源 4. STM32的系统架构 5. 从0到1搭建一个STM32工程 学习stm32已经很久了,因为种种原因,也有很久一段时间没接触过stm32了。等我捡起来的时候,发现很多都已经忘记了,重新捡…...

AI绘画Stable Diffusion 超强一键去除图片中的物体,免费使用!
大家好,我是设计师阿威 在生成图像时总有一些不完美的小瑕疵,比如多余的物体或碍眼的水印,它们破坏了图片的美感。但别担心,今天我们将介绍一款神奇的工具——sd-webui-cleaner,它可以帮助我们使用Stable Diffusion轻…...

零基础STM32单片机编程入门(一)初识STM32单片机
文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据…...
Github上前十大开源Rust项目
在github上排名前十的Rust开源项目整理出来与大家共享,以当前的Star数为准。 Deno Deno 是 V8 上的安全 TypeScript 运行时。Deno 是一个建立在V8、Rust和Tokio之上的 JavaScript、TypeScript 和 WebAssembly 的运行时环境,具有自带安全的设置和出色的开…...

硬件开发笔记(二十):AD21导入外部下载的元器件原理图库、封装库和3D模型
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139707771 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...

竞赛选题 python opencv 深度学习 指纹识别算法实现
1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 python opencv 深度学习 指纹识别算法实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:4分创新点:4分 该项目较为新颖…...

RK3568开发笔记(三):瑞芯微RK3588芯片介绍,入手开发板的核心板介绍
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139905873 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
EtherCAT主站IgH解析(二)-- 如何将Igh移植到Linux/Windows/RTOS等多操作系统
版权声明:本文为本文为博主原创文章,转载请注明出处 https://www.cnblogs.com/wsg1100 如有错误,欢迎指正。 本文简单介绍如何将 igh 移植到 zephyr、freertos、rtems、rtthread等RTOS ,甚至 windows 上。 ##前言 目前࿰…...
ansible copy模块参选选项
copy模块用于将文件从ansible控制节点(管理主机)或者远程主机复制到远程主机上。其操作类似于scp(secure copy protocol)。 关键参数标红。 参数: src:(source:源) 要复制到远程…...
展厅设计主要的六大要素
1、从创意开始 展示设计的开始必须创意在先。根据整体的风格思路进行创意,首先要考虑的是主体的造型、大小高度位置以及它和周围展厅的关系。另外其他道具设计制作与运作方式也必须在创意中有明确的体现。 2、平面感 平面感是指对展示艺术设计平面图纸审美和功能两个…...

【数据结构与算法】最小生成树,Prim算法,Kruskal算法 详解
最小生成树的实际应用背景。 最节省经费的前提下,在n个城市之间建立通信联络网。 Kruskal算法(基于并查集) void init() {for (int i 1; i < n; i) {pre[i] i;} }ll root(ll a) {ll i a;while (pre[i] ! i) {i pre[i];}return i p…...

【启明智显产品分享】Model3工业级HMI芯片详解系列专题(三):安全、稳定、高防护
芯片作为电子设备的核心部件,,根据不同的应用领域被分为不同等级。工业级芯片适用于工业自动化、控制系统和仪器仪表等领域,对芯片的安全、稳定、防护能力等等有着较高的要求。这些芯片往往需要具备更宽的工业温度范围,能够在更恶…...

【面试干货】Java中的四种引用类型:强引用、软引用、弱引用和虚引用
【面试干货】Java中的四种引用类型:强引用、软引用、弱引用和虚引用 1、强引用(Strong Reference)2、软引用(Soft Reference)3、弱引用(Weak Reference)4、虚引用(Phantom Reference…...
对称/非对称加密
对称加密和非对称加密是两种主要的加密方式,用于保护数据的机密性和完整性。它们在密钥的使用和管理上有着显著的不同。 对称加密 原理 对称加密(Symmetric Encryption)使用相同的密钥进行加密和解密。这意味着发送方和接收方必须共享相同…...
DDei在线设计器-API-DDeiSheet
DDeiSheet DDeiSheet是代表一个页签,一个页签含有一个DDeiStage用于显示图形。 DDeiSheet实例包含了一个页签的所有数据,在获取后可以通过它访问其他内容。DDeiFile中的sheets属性记录了当前文件的页签列表。 一个DDeiFile实例至少包含一个DDeiSheet…...
随想录 Day 69 并查集 107. 寻找存在的路径
随想录 Day 69 并查集 107. 寻找存在的路径 理论基础 int n 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好 vector<int> father vector<int> (n, 0); // C里的一种数组结构// 并查集初始化 void init() {for (int i 0; i < n; i)…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...