python的类如何使用?兔c同学一篇关于python类的博文概述
本章内容如目录 所示:
文章目录
- 1. 创建和使用类
- 1.1 创建第一个python 类
- 1.2 版本差异
- 1.3 根据类创建实例
- 1. 访问属性
- 2. 调用方法
- 3. 创建多个实例
- 2. 使用类和实例
- 2.1 给属性指定默认值
- 2.2 修改属性的值
- 3. 继承
- 3.1 子类的 __init __()
- 3.2 给子类定义属性和方法
- 3.3 重写父类的方法
- 3.4 将实例用作属性
- 4. 导入类
- 4.1 导入单个类
- 4.2 在一个模块中存储多个类
- 4.3 在一个模块中存储多个类
- 4.4 导入整个模块
- 4.5 导入模块中的所有类
导言
面向对象编程是最有效的软件编写方法之一。在面向对象编程中你编写表示显示世界中的事务和情景类,并基于这些类来创建对象。
编写类时,你定义一大类对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。
根据类来创建对象被称为实例化,这让你能够使用类的实例。
.
.在本章中,你将编写一些类并创建其实例。你将指定可在实例中存储什么信息,定义可对这些实例执行哪些操作。你还将编写一些类来扩展既有类的功能,让相似的类能够高效地共享代码。还可以将自己编写的类存储在模块中,并在自己的程序文件中导入其他程序员编写的类。
1. 创建和使用类
1.1 创建第一个python 类
使用类几乎可以模拟任何东西。下面我们来编写一个简单的 小狗 dog 类,它表示的不是某个特定的小狗,而是任何小狗,它具备姓名,年龄,还有属于小狗的某种行为。
现在我们来编写这个表示小狗的类:
# 创建小狗类
class Dog():#初始化函数def __init__(self,name,age):#self 这个参数代表 当前对象的实例本身,#所以通过self 来调用,self不是固定关键词,可以起成任意一个名字#在类当中定义的所有函数的第一个参数都是 当前对象实例的本身self.name = nameself.age = age#定义狗子 蹲下函数def sit(self):print("狗子:"+self.name+",现在已经蹲下来了....")#定义狗子 打滚函数def roll_over(self):print("狗子:"+self.name+"正在打滚....")
现在我们已经创建好了一个简单的 python 类,
在python 中,类的名称是以大写字母开头的,类定义中的括号是空的,因为我们要从空白创建这个类。
关于 __ init __() 方法:
在类中的函数称为方法;我们前面学到的有关函数的一切都适用于方法,需要注意的有差别的一点是:调用方法的方式。
__ init __() 是一个特殊的方法,每当我们根据 Dog 类创建实例时, python 都会自动运行它。在这个方法的名称中,开头黑末尾各有两个下划线,这是一种约定:旨在避免 python 默认方法与普通方法发生名称冲突。
关于 self 参数具体说明
在__ init ()方法中,我们一共定义了三个参数:self、name、age。 形参 self
是必不可少的,且必须位于参数列表的最前面。为何必须定义 self 形参呢? 因为 python 调用这个 init __()
方法来创建Dog类的实例时,将自动传入 实参self,每个与类相关的方法调用都自动传递实参
self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
通过实例访问的变量称为属性。
1.2 版本差异
在 python 2.+ 的版本定义类的语法:
class Dog(object):
在 python 3.+ 的版本定义类的语法:
class Dog():
1.3 根据类创建实例
我们可将类视为有关如何创建实例的说明。Dog类是一系列说明,让 python 知道如何创建表示特定小狗的实例:
class Dog():#初始化函数def __init__(self,name,age):#self 这个参数代表 当前对象的实例本身,#所以通过self 来调用,self不是固定关键词,可以起成任意一个名字#在类当中定义的所有函数的第一个参数都是 当前对象实例的本身self.name = nameself.age = age#定义狗子 蹲下函数def sit(self):print("狗子:"+self.name+",现在已经蹲下来了....")#定义狗子 打滚函数def roll_over(self):print("狗子:"+self.name+"正在打滚....")# Dog类的实例创建过程
my_dog = Dog('小白',4)
print('我的小狗叫:'+my_dog.name+',它今年'+str(my_dog.age)+'岁')
通常:类的命名以大写字母开头,而类的实例以小写字母开头。
1. 访问属性
想要访问实例的属性,可使用句点表示法。
例如在上述代码当中:
my_dog.name
就是对属性的使用。
句点在 python 当中很有用,在这个调用过程当中,python 会先找到实例 my_dog。在查找与这个实例相关联的属性 name。
在 Dog 类中引用这个属性时,使用的是 self.name。我们也使用同样的方法来获取属性 age 的值。
2. 调用方法
Dog类创建实例后,就可以使用句点表示法来调用 Dog类中定义的任何方法。
下面我们来调用 小狗打滚和蹲下的方法。
my_dog.sit()
my_dog.roll_over()
3. 创建多个实例
一个类 可以对应多个实例,实例并非只有一个。类是抽象的概念,
比如小狗,小狗可能有多只,可能是小白,小黑,小黄。它们都是小狗,所以一个类,
可以创建多个实例。
例如,我的小狗 我会将代码写成:
my_dog = Dog()
而你也有一只小狗,我还可以继续使用这个类进行实例化。
your_dog= Dog()
至于你的小狗叫什么名字,我的小狗叫什么名字,它们年龄是几岁?
直接通过变量名调用属性,给它们赋值就行了。
或者你也可以将参数写在括号里,通过 初始化方法进行赋值。
2. 使用类和实例
现在我们来编写一个表示汽车的类,使其存储有关汽车的信息。
class Car():#初始化方法def __init__(self,model,colour):self.model =modelself.colour =colour#小汽车的基本信息描述def get_carInfo(self):info = '它是一辆'+self.colour+'颜色的'+self.model+'车'return infomy_car = Car('BMW','白')
print(my_car.get_carInfo())
我们看一下这段代码的运行结果。
一个基本的 汽车类的模板,我们就定义好了,下面我们利用新的知识,不断对模板进行改进。
2.1 给属性指定默认值
类中的每个属性都必须有初始值,哪怕这个值是 0 或 空的字符串。
在有些情况下,设置默认值时, 在 初始化方法内 指定初始值也是可行的。
如果对某个属性这样设置了,就无需包含为它提供初始值的形参。
给小汽车添加 里程的属性。
class Car():#初始化方法def __init__(self,model,colour,mileage):self.model =modelself.colour =colourself.mileage = 0#小汽车的基本信息描述def get_carInfo(self):info = '它是一辆'+self.colour+'颜色的'+self.model+'车'return info# 小汽车的行驶里程记录def get_carMileage(self):print('该汽车已经行驶了:'+'self.mileage'+'公里')
设置好了小汽车的模板,我们在来生产一辆崭新的黑色大众汽车。
my_car = Car('大众','黑')
print(my_car.get_carInfo())
print(my_car.get_carMileage())
2.2 修改属性的值
刚才我们给属性设置了默认值,而这里给大家介绍三种修改属性值的方法:
一种是 通过实例进行修改,
对属性的值,直接进行修改,最简单的方式是通过实例直接访问它。
以上面的小汽车类举例。
# 实例化一个新的小汽车
new_Car = Car('大众汽车','黑')
#获取该小汽车的信息
print(new_Car.get_carInfo())#现在,我们将小汽车颜色修改为 白色
new_Car.colour ='白'
#重新获取该小汽车的信息
print(new_Car.get_carInfo())
接下来,我们看一下修改后的输出信息:
我们看到小汽车的参数值已经修改成功了。
一种是 通过方法进行设置,
如果有更新属性的方法,可以将参数值传递给方法,无需在直接访问属性。
因为此时的参数值会在该方法的内部进行更新。
#计算小汽车里程数信息的方法
def update_CarInfo(self,mileage):self.mileage=mileage
'''该方法被调用时,接收调用处传递的实参,将该参数重新赋值到计录里程变量中'''#下面正常创建小汽车类
new_car =Car('大众汽车','黑色')
print(new_car.get_carInfo())
#得到小汽车信息以后,在调用获取里程数方法,查看里程
print(new_car.get_carMileage())#经过一段时间的驾驶后,通过小汽车里程更新方法更新它的里程
new_car.update_CarInfo(20)
#重新打印小汽车的里程数
print(new_car.get_carMileage())
写好代码以后,我们来输出查看小汽车的里程数:
发现小汽车的里程数已经更新到20公里了。
一种是 通过方法进行递曾。
有时候我们需要给属性值传递特定的量,而不是将其设置为全新的值。
就像小汽车的里程,总是在增加的。
我们写一个实例来说明如何传递这个增量。
#设置小汽车里程增量方法
def increment_mileage(self,miles):self.mileage+=miles#购买新的小汽车
new_car = Car("大众甲壳虫",'黄')#每日用车 10公里,设置没人增加里程
new_car.increment_mileage(10)#获取小汽车的信息
print(new_car.)
我们来看一下程序的执行结果:
3. 继承
编写类时,不一定总是从零开始,如果你要编写的类是另一个现成类的特殊版本。
可以使用继承,一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;
原有的类称为父类,而新的类被称为子类。
子类会继承父类的所有属性和方法,同时还可以定义自己的属性和方法。
3.1 子类的 __init __()
创建子类的实例时,python 首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法__init __() 需要父类施以援手。
例如我们创建一个电动汽车类,电动汽车是一种特殊的汽车,因此我们可以基于前面创建的 Car类,创建一个新的类。这样我们就只需要为电动汽车特有的属性和行为编写代码。
#电动汽车类
class ElectricCar(Car):def __init__(self,model,colour):super().__init__(model,colour)#实例化子类
eCar = ElectricCar('特斯拉','黑')
#显示该汽车信息
print(eCar.get_carInfo())
这里需要注意,创建子类时,必须要在同一个文件内有父类的代码包含其中。
在这个示例中,没写父类代码是因为省略了。
而且父类的代码必须位于子类代码的前面。
现在我们来运行一下这段程序代码,
看看子类是否成功继承父类了,并且是否可以成功调取到父类的方法。
关于 super() 方法的说明:
super() 是一个特殊的函数,帮助python将父类和子类关联起来。
super().init(model,colour) 这行代码,让python 调取 ElecticCar 的父类的方法 __init __(),让其子类也包含其父类的所有属性。
3.2 给子类定义属性和方法
让一个类继承另一个类以后,可添加区分子类和父类所需的新属性和方法。
下面我们来给子类添加一个独有的显示电动汽车的 电池相关描述的属性和方法。
#电动汽车类
class ElectricCar(Car):def __init__(self,model,colour):super().__init__(model,colour)self.battery_size = 60#电池汽车信息状态def describe_battery(self):print('您汽车的电池能源剩余:'+str(self.battery_size))#实例化子类
eCar = ElectricCar('特斯拉','黑')
#显示该汽车信息
print(eCar.get_carInfo())
#显示电池状态
print(eCar.describe_battery())
其实在这段代码当中,跟我们之前设置属性的初始化参数时意思相同,不同的是这次的默认值是设置在子类当中,而父类没有这个方法。其实本质还是对默认值的一个设置和使用。在初始化方法中新添加一个独有的属性,然后设置好默认值。在新定义一个显示电池信息状态的方法,在这个方法中调到独有属性。最后,哪里实例化子类,调用这个方法,就会在哪里成功显示出电池信息。
3.3 重写父类的方法
对于父类的方法,只要它不符合子类模拟的实物的行为,都可以对其进行重写。
在我们编写的父类代码当中,这个方法 大家还记不记得?
# 小汽车的行驶里程记录def get_carMileage(self):print('该汽车已经行驶了'+str(self.mileage)+'公里')
我们就用这个方法来做重写的测试,
在汽车中,里程数是不断记录的。而在电动车中,我们将其重写成另一种记录形式:
#电动汽车类
class ElectricCar(Car):def __init__(self,model,colour):super().__init__(model,colour)self.battery_size = 60#汽车电池信息状态def describe_battery(self):print('您汽车的电池能源剩余:'+str(self.battery_size))#电动车的行驶里程记录def get_carMileage(self):print('该汽车电池已消耗:'+str(self.mileage)+'公里')#实例化子类
eCar = ElectricCar('特斯拉','黑')
#显示该汽车信息
print(eCar.get_carInfo())
#显示电池状态
print(eCar.describe_battery())#别忘了调用一下修改 里程数的方法
eCar.update_CarInfo(10)
#调用 动车的行驶里程记录
print(eCar.get_carMileage())
现在我们来看一下输出结果,看看子类重写父类的方法是否成功?
3.4 将实例用作属性
使用代码模拟事务时,你可能会发现自己给类添加的细节越来越多:属性和方法清单以及文件都越来越长。在这种情况下,可能需要将类的一部分作为一个独立的类提取出来。你可以将大型的类拆分成多个协同工作的小类。
例如,不在给电动汽车类添加细节,我们可能会发现其中包含很多专门针对汽车点评的属性和方法。在这种情况下,我们可将这些属性和方法提取出来,放到另一个名为 Battery的类中,并将一个Battery实例用作 ElectricCar类的一个属性:
其实就是将属性封装到一个类里,然后在将这个类作为 本类的属性。
class Battery():def __init__(self,battery_size=60):#初始化电池信息self.battery_size=battery_size#汽车电池信息状态def describe_battery(self):print('您汽车的电池能源剩余:'+str(self.battery_size))#创建电动汽车类
class ElectricCar(Car):def __init__(self,model,colour):super().__init__(model,colour)self.battery = Battery()#实例化子类
eCar = ElectricCar('特斯拉','黑')
#显示该汽车信息
print(eCar.get_carInfo())
#显示电池状态
print(eCar.battery.describe_battery())
其实这里并没有改动代码的逻辑,只是将一些属性进行了封装,当然这是 java中的概念,简单来说,就是将 某个类的 过多属性 或者是方法 定义到一个类中,在将这个类作为 我们要操作类的属性,通过这个属性来操作繁多的内容。
我们来看一下输出结果:
4. 导入类
随着不断给类添加功能,文件可能变的很长,即便妥善地使用了继承亦然如此。为遵循python的总体理念,应让文件尽可能整洁。为在这方面提供帮助, python 允许你将类存储在模块中,然后在主程序中导入所需的模块。
4.1 导入单个类
from 文件名 import 类名
4.2 在一个模块中存储多个类
虽然在一个模块当中的类应该存在相关性,但也可以根据需要在一个模块中存储任意数量的类。
from 文件名 import 之类名 #同时可以调用与该类的相关的类,如 父类,封装的属性和方法的类
4.3 在一个模块中存储多个类
可以根据需要在程序文件中存储任意多个类
from 文件名 import 类名,类名 #用小写逗号分隔
4.4 导入整个模块
也可以导入整个模块,然后在通过句点表示法访问需要的类。
import 文件名
4.5 导入模块中的所有类
from module_name模块名 import *
相关文章:

python的类如何使用?兔c同学一篇关于python类的博文概述
本章内容如目录 所示: 文章目录1. 创建和使用类1.1 创建第一个python 类1.2 版本差异1.3 根据类创建实例1. 访问属性2. 调用方法3. 创建多个实例2. 使用类和实例2.1 给属性指定默认值2.2 修改属性的值3. 继承3.1 子类的 __init __()3.2 给子类定义属性和方法3.3 重写…...

Day60 动态规划总结
647. 回文子串 回文的做法注定我们得从里面入手,逐渐扩散到边界 初始化:准备一个ans,找到一个回文子串加一个 dp [[0] * n for _ in range(n)]ans 0 遍历公式: 当s[i]s[j]的时候,只要里面还是回文串,就能…...

UVM仿真环境搭建
环境 本实验使用环境为: Win10平台下的Modelsim SE-64 2019.2 代码 dut代码: module dut(clk,rst_n, rxd,rx_dv,txd,tx_en); input clk; input rst_n; input[7:0] rxd; input rx_dv; output [7:0] txd; output tx_en;reg[7:0] txd; reg tx_en;always…...

Azure AI基础到实战(C#2022)-认知服务(1)
目录 Azure 认知服务概述计算机视觉概述数据隐私和安全性计算机视觉快速入门光学字符识别 (OCR)OCR APIOCR 常用功能Azure 门户准备两种部署方式OCR项目实战之车牌识别Azure 认知服务概述 Azure 认知服务是基于云的人工智能 (AI) 服务,可帮助开发人员在不具备直接的 AI 或数据…...

光栅化Triangles(笔记)
field of view (可见区域) 该角度越大,需要透视投影的角度越大,成像显示的内容越多 有Y值,则可得出成像范围 屏幕: 典型的光栅处理设备所有像素都被表示为x,y坐标轴形式 3D方块成像步骤: 先将其所在平面化为 与屏幕等长等宽的形式: 如何将一个三角形拆成像素?采样…...

【Oarcle】如何显示日本年号的日期格式 ?
语句大于一切,还需要语言吗? 1. SELECT TO_CHAR(SYSDATE,EEYY/MM/DD,NLS_CALENDAR JAPANESE IMPERIAL) from dual;结果是: 令和05/02/25 Oracle SQL文中,年月日的显示,一定要使用双引号括起来,如 select…...

57_Pandas中的json_normalize将字典列表转换为DataFrame
57_Pandas中的json_normalize将字典列表转换为DataFrame 可以使用 pandas.json_normalize() 将具有公共键的字典列表转换为 pandas.DataFrame。 由于它是一种常用的JSON格式,可以通过Web API获取,所以能够将其转换为pandas.DataFrame是非常方便的。 在…...

OpenAPI SDK组件之javassist字节码
javassist介绍 Javassist是一个开源的分析、编辑和创建Java字节码的类库,主要优点是简单,不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。 apisdk应用javassist 在apisdk中主要依靠javassist增强开发者声明的开放…...

【LeetCode】1247. 交换字符使得字符串相同(超级简单的算法,击败100%)
有两个长度相同的字符串 s1 和 s2,且它们其中 只含有 字符 "x" 和 "y",你需要通过「交换字符」的方式使这两个字符串相同。 每次「交换字符」的时候,你都可以在两个字符串中各选一个字符进行交换。 交换只能发生在两个…...

23. 合并K个升序链表
解题思路:两种解法,一种优先级队列,一种分治优先级队列解法:以节点中存储的值进行排序依次遍历所有的链表,把链表中的节点加入到优先级队列中依次从优先级队列的弹出并删除最小的元素加入到新的链表中,直到…...

软中断与tasklet简介
一、软中断 1.1 何为软中断? Linux 系统为了解决中断处理程序执行过长的问题,将中断过程分成了两个阶段,分别是「上半部(Top Half)和下半部分(Bottom Half)」。 上半部用来快速处理中断。一…...

JUC 之 线程阻塞工具 LockSupport
——LockSupport 与 线程中断 线程中断机制 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,所以,Thread.stop,Thread.suspend,Thread.resume 都已经被废弃 在 Java 中没有办法立即停止一条线…...

常用数据结构总结-Java版
常用数据结构总结(Java版) C/Java/Python 数据结构大比较 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dokzp1HQ-1677329125447)(assets/image-20220116142815859.png)] array 同一种类型数据的集合,其实数组…...

【基础算法】二分例题(我在哪?)
🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前…...

怕上当?来看这份网络钓鱼和诈骗技术趋势
网络钓鱼和诈骗:当前的欺诈类型 网络钓鱼 钓鱼者可以攻击任何在线服务——银行、社交网络、政府门户网站、在线商店、邮件服务、快递公司等——中的证书。但是,顶级品牌的客户往往面临更大风险,因为相比小品牌,人们更喜欢使用和…...

2023年全国最新保安员精选真题及答案6
百分百题库提供保安员考试试题、保安职业资格考试预测题、保安员考试真题、保安职业资格证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 61.关于保安员职业资格条件说法正确的是()。 A:必须考试合格…...

unity热更新新方案,ILRuntime
ILRuntime 是一个独立的、跨平台的 .NET Runtime,可用于在 Unity 中实现热更功能。使用 ILRuntime,您可以在游戏运行时加载和执行 C# 脚本,而不需要重新编译整个项目。 以下是一些使用 ILRuntime 的基本步骤: 在 Unity Asset St…...

【J1】【队列】报数游戏
题目描述 有 n 个小朋友围成一圈玩游戏,小朋友从 1 至 n 编号,2 号小朋友坐在 1 号小朋友的顺时针方向,3 号小朋友坐在 2 号小朋友的顺时针方向,……,1 号小朋友坐在 n 号小朋友的顺时针方向。 游戏开始,…...

《程序员的自我修养》阅读笔记
文章目录【第2部分】静态链接1 编译过程2 编辑器的工作流程3 链接——模块的拼接4 目标文件目标文件中的段(section)ELF文件结构5 静态链接1 空间与地址分配2 符号解析与重定位【第3部分】装载与动态链接1 装载的方式2 进程的启动3 为什么需要动态链接&a…...

【跟着ChatGPT学深度学习】ChatGPT带我入门深度学习
❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...

软工2023个人作业一——阅读和提问
项目内容这个作业属于哪个课程2023年北航敏捷软件工程这个作业的要求在哪里个人作业-阅读和提问我在这个课程的目标是学习并掌握现代软件开发和项目管理技术,体验敏捷开发工作流程这个作业在哪个具体方面帮助我实现目标通读《构建之法》,了解软件工程中基…...

【Redis】线程模型:Redis是单线程还是多线程?
【Redis】线程模型:Redis是单线程还是多线程? 文章目录【Redis】线程模型:Redis是单线程还是多线程?Redis 是单线程吗?Redis 单线程模式是怎样的?Redis 采用单线程为什么还这么快?Redis 6.0 之前…...

FSM(有限状态机)
FSM有限状态机FSM创建控制有限状态机的脚本设置FSM状态机下的各个状态添加测试类FSM的优点FSM 虽然Unity已经有了动画状态机,但是为了代码的开放封闭原则,这时FSM有限状态机的作用就凸显了出来。 创建控制有限状态机的脚本 先创建一个脚本用来控制有限…...

奇妙的background-clip:text
我们在学习CSS3时,一个背景属性background-clip用来对背景进行裁剪,即指定背景绘制的区域,通常我们使用的几个属性如下:值说明border-box默认值。背景绘制在边框方框内(剪切成边框方框)。padding-box背景绘…...

Vmware虚拟机无法联通主机解决方法二
昨天在遇到了VMware 虚拟机无法联通主机,导致我在CentOS-7 搭建的伪Hadoop3 服务,无法访问管理平台,使用将网络编辑器修改为“桥接”模式解决。今天在学习HBase 时,昨天的问题又重新了,我通过SSH 工具MobaXterm 都无法…...

Boost资料整理备忘
Boost资料整理备忘 网络资源 书籍: The Boost C Libraries官方文档 Boost Library Documentation random boost.randomBoost随机库的简单使用:Boost.Random(STL通用)tutorialstd::random boost::asio Boost.Asio 网络编程 - 基本原理Boost.Asio DocBoost定时器 网…...

规则引擎与风控系统01:新问题,新挑战
如果说在支付系统中使用设计模式,以及开发自定义协议的物联网这两类应用还不够酷的话,那么接下来,咱们就来学一点高逼格的技术吧。 在互联网已经日益普遍的时代,不管是开发2C应用还是2B应用,相信大部分的开发者都有过处理复杂业务逻辑的经历,比如电商、社交、电子政务、O…...

Oracle-00-卸载篇
这里给出企业级的Oracle 10g的卸教程,新安装的19c并没有正经去做卸载的操作,为了后面教程的进度,这里就先借用下10g,如果有需要会重新更新19c的卸载教程 windows服务中将Oracle所有服务全部停掉 选中Oracle - OraDb10g_home2->Oracle Installation Products->Univers…...

Java线程池使用与原理解析1(线程池优点、使用方法、参数含义及线程池运转机制)
为什么要使用线程池? JDK1.5后JUC包添加了线程池相关接口,在Java诞生之初并没有线程池这个概念。刚开始Java程序都是自行创建线程去处理任务。随着应用使用的线程越来越多,JDK开发者们发现有必要使用一个统一的类来管理这些线程,…...

windows下编译leveldb(动态库+静态库)
环境准备 1)下载cmake并安装 下载路径: https://cmake.org/download/2)下载leveldb源码 git clone https://github.com/google/leveldb.git3)下载googletest和benchmark,cmake编译时需要 # 进入leveldb源码路径下的third_part…...