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

第二阶段第一章——面向对象

前言

学习了这么久Python(呃其实也没多久差不多两周),可能有小伙伴说我废了,两周才学这么点,咋说呢,我曾经也是急于求成,做任何事情都是急于求成,比如我喜欢一个人我就想马上跟她在一起,我学习Java为了拉进度并没有做笔记,学习MySQL高级的内容(比如主从复制和它的底层原理这些)也是没有做笔记,学习Linux也是没有做笔记。很后悔,所以我才开始写下博客,当然这只是写博客的一部分原因。还有一些原因是我想在互联网上发疯,反正也没有人认识我是谁哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

回归正题,面向对象,无论是Java还是C++,这一点都是很重要的一点,Python虽然是一个解释性语言,但是在设计之初就是面向对象而设计的。

对于初学一门编程语言的同学就会问啦,什么是面向对象呀?

答:面向你的男/女朋友编程  即为面向对象 \(^o^)/~( 疯狂手动俏皮)

        面向对象是一种程序设计思想,它将程序中的数据和操作数据的方法组合成一个对象,通过对象之间的交互来实现程序的功能。面向对象的程序设计思想主要包括封装、继承和多态三个方面。

封装使得对象的内部实现对外部隐藏,只有通过公共接口才能访问对象的属性和方法,从而保证了对象的安全性和可靠性。继承让子类可以复用父类的属性和方法,并且可以在子类中新增或重写父类的属性和方法,从而简化了程序的设计和维护。多态则使得同一个方法可以具有多种不同的行为,增加了程序的灵活性和可扩展性。

这一章主要有以下内容

1.初识对象

2.成员方法

3.类和对象

4.构造方法

5.其他内置方法

6.封装

7.继承

8.类型注解

9.多态

10.综合案例

GOGOGO!!!!!


1.初识对象

代码示例:

"""初识面向对象
"""
# 1.设计一个类(类比:生活中设计一张登记表)
class Student:name = Nonesex = Nonenationality = Nonenative_place = Noneage = None
# 2.创建一个对象(类比:生活中打印一张登记表)
stu_1 = Student()
# 3.对象属性进行赋值(类比:生活中填写一张登记表)
stu_1.name = "瓦坎达!!!"
stu_1.sex = "男"
stu_1.nationality = "地球瓦坎达"
stu_1.native_place = "地球"
stu_1.age = "19"
# 4.获取对象中记录的信息
print(stu_1.name)
print(stu_1.sex)
print(stu_1.nationality)
print(stu_1.native_place)
print(stu_1.age)


2.成员方法

(1)成员方法的概念

通过上面的,你已经了解了如何使用了,那么就来系统的了解一下吧

类里面包含两个东西

属性我们在上面已经见识过了

那么类里面的属性又是什么呢?

也就是类里见提供的函数(方法)了

也就是===》》成员方法

(2)成员方法的创建

那么该如何来创建成员方法呢?、

和我们曾今创建方法的方式差不多,但是有一个小差别

注意:传参时,可以当做self并不存在,不必理会

(3)代码示例

"""成员方法
"""# 定义一个带有成员方法的类
class Student:name = Nonedef say_hi(self):print(f"大家好,我是{self.name},o(* ̄▽ ̄*)ブ")def say_hello(self, msg):print(f"大家好,我是:{self.name},{msg}")stu = Student()
stu.name = "lyy"stu.say_hi()stu2 = Student()
stu2.name = "wgg"
stu2.say_hello("(*´▽`)ノノ")


3.类和对象

这里来深刻的体会一下面向对象的思想

类是图纸,对象是实现 

代码实现

"""体会面向对象编程
"""
import winsound# 设计一个闹钟类
class Clock:id = Noneprice = Nonedef ring(self):winsound.Beep(2000, 3000)clock1 = Clock()
clock1.id = "001"
clock1.price = 812
clock1.ring()print(f"闹钟id:{clock1.id},价格:{clock1.price}")clock2 = Clock()
clock2.id = "002"
clock2.price = 313
clock2.ring()
print(f"闹钟id:{clock1.id},价格:{clock1.price}")


4.构造方法

(1)使用构造方法

构造方法还是挺简单的,简化了赋值操作

其实这里的self,学到这里就可以发现和Java里面的  this关键词有点类似了

"""演示构造方法
""""构造方法的名称为::__init__"
class Student:# 这里写不写无所吊谓name = Nonesex = Noneage = Nonedef __init__(self, name, sex, age):self.name = nameself.sex = sexself.age = ageprint(f"student类创建了一个类")stu = Student("lyy", "男", 19)
print(stu.name)
print(stu.age)
print(stu.sex)

(2)练习案例:学生信息录入

代码示例

"""练习案例,学生信息录入
"""
class Student:name = Noneage = Noneaddress = Nonedef __init__(self, name, age, address):self.name = nameself.age = ageself.address = addressprint(f"学生信息录入完成:【姓名:{name},年龄:{age},地址{address}】")# 共需要录入10个学生
stu_num = int(input("请输入共需要录入多少学生"))for stu in range(1, stu_num + 1):stu_name = input("请输入学生姓名")stu_age = input("请输入年龄")stu_address = input("请输入地址")stu = Student(stu_name, stu_age, stu_address)


5.其他内置方法(魔术方法)

(1)__str__字符串方法

但是哈

咋说呢,我只能说和Java的toString( )方法是差不多的

(2)__lt__小于、大于符号比较

(3)__le__小于等于、大于等于符号比较

(4)__eq__ ==符号比较

 

(5)总结

"""演示其他的内置方法
"""class Student:def __init__(self, name, age):self.name = nameself.age = age# (1)__str__字符串方法def __str__(self):return f"name:{self.name},age:{self.age}"# (2)__lt__小于、大于符号比较def __lt__(self, other):return self.age < other.age# (3)__le__小于等于、大于等于符号比较def __le__(self, other):return self.age <= other.age# (4)__eq__ ==符号比较def __eq__(self, other):return self.age == other.agestu1 = Student("lyy", 18)
stu2 = Student("wgg", 19)
stu3 = Student("GO", 19)
print(stu1 < stu2)
print(stu1 <= stu2)
print(stu2 == stu3)

 


6.封装

面向对象三大特性

封装、继承和多态

(1)封装

(2)私有成员

相比于Java的区别,这里私有成员的定义是使用 ' __  '两个下划线 而不是private

(3)使用私有成员

其实  私有成员也就是只能给“自己人”用

曾今的方法显然是不管用的,那么

如何使用私有成员呢?

代码示例:

"""演示私有成员
"""class Phone:__current_voltage = 0.1  # 运行电压def __keep_single_core(self):print("cpu单核运行")def call_by_5G(self):if self.__current_voltage >= 1:print("5G通话已开启")else:self.__keep_single_core()print("电量不足:节能模式")phone = Phone()
# phone.__keep_single_core  用不了
# phone.__current_voltage 也用不了phone.call_by_5G()

(4)练习案例:设计带有私有成员的手机

参考代码:

"""设计带有私有成员的手机
"""class Phone:__is_5g_enable = Falsedef __check_5g(self):if self.__is_5g_enable == True:print("5g开启")else:print("5g关闭,使用4g信号")def call_by_5g(self):self.__check_5g()print("正在通话中")def open_or_down_5g(self):"""是否开启5g:return:"""str = input("你是否要开始y/n")if str == "y":self.__is_5g_enable = Trueelse:self.__is_5g_enable = Falsephone = Phone()
phone.open_or_down_5g()
phone.call_by_5g()


7.继承

如何理解继承?

答:

继承是面向对象编程中的一个概念,它指的是一个新类(子类)可以从现有的类(父类)继承属性和方法。在继承中,父类中存在的公共属性和方法可以被子类直接使用,子类也可以根据需要重写父类中的方法或添加新的属性和方法。

继承可以帮助程序员重用已有的代码和类,避免重复的编写和维护。继承也可以实现代码的扩展和灵活性,子类可以在不改变原有功能的基础上,增加新的功能。

继承的实现方式可以通过关键字extends来实现,子类可以继承父类的属性和方法,并且可以调用父类的构造器来初始化子类的对象。在Java中,一个子类只能继承一个直接父类,但是可以通过多级继承从祖先类中继承属性和方法。

(1)单继承

相比于Java的继承方法采用extend关键词,这里只需要将父类作为参数传入即可

(2)多继承

这里就发现了又一个和Java 的区别了,Java是不支持多继承的,而Python是支持的

注意事项

谁先继承,谁的优先级更高

(3)复写

其实就是相当于Java的重写

(4)调用父类同名成员


8.类型注解

Python 3.5引入了一种类型注解机制,即PEP 484,它使开发者可以在函数参数和函数返回值中注明变量类型。类型注解可以帮助开发者更好地理解代码,并提高代码的可读性和可维护性。

类型注解在Python中并不会严格检查类型,也不会影响程序运行。它仅仅是给开发者提供了一种规范和提示,让开发者更好地编写代码。

示例如下:


def add_numbers(a: int, b: int) -> int:return a + b

在这个例子中,我们使用类型注解来告诉函数参数a和b应该是整数类型,函数返回值也应该是整数类型。当然,如果我们在调用add_numbers函数时传入的参数类型不是整数,Python解释器也不会报错。但是,通过类型注解,我们可以清楚地知道这个函数的参数和返回值类型应该是什么。

我对于这个的理解是,她想约束类型,但是还是算了,所以相当于给出一个规范,你可以遵守,也建议你遵守

(1)变量的类型注解

1.普通变量

2.容器

3.在注释中进行类型注解

4.限制

代码示例;

"""演示变量的类型注解
"""
import json
import random# 基础数据类型注解
var1: int = 12
var2: str = "lyy"
var3: bool = True# 类对象类型注解
class Student:passstu: Student = Student()# 基础容器类型注解
my_list: list = [1, 2, 3]
my_tuple: tuple = (1, 2, 3)
my_dict: dict = {"lyy": 812}
# 容器类型详细注解
my_list: list[int] = [1, 2, 3]
my_tuple: tuple[int, str, bool] = (1, "wgg", False)
my_dict: dict[str, int] = {"lyy": 812}# 在注释中进行类型注解
var1 = random.randint(1, 10)  # type: int
var2 = json.loads('{"name":"zhangsan"}')  # type: dict[str, str]def func():return 10var3 = func()  # type: int# 类型注解的限制
var4: int = "我就用字符串了"
# 运行也不报错

(2)函数(方法)的类型注解

1.形参注解

 2.返回值注解

整体参考代码

"""对函数进行类型注解
"""# 对参数进行类型注解
def add(x: int, y: int):return x + yprint(add(812, 313))# 对返回值进行注解
def func(data: list) -> list:return data

 

(3)Union类型

代码示例:

"""演示Union联合类型注解
"""
# 使用Union类型,得先导包
from typing import Unionmy_list: list[Union[int, str]] = [1, 2, "lyy", "wgg"]def func(data: Union[int, str]) -> Union[int, str]:passfunc()


9.多态

(1)多态的概念

多态常用于继承的关系上 

(2)抽象类(接口) 

如何理解抽象类?

答:

在Python中,抽象类是使用abc模块(Abstract Base Class)来定义的。抽象类不能被实例化,而是用来规范其他类的行为。抽象类中定义了一些抽象方法,这些方法必须在子类中被实现。

要定义一个抽象类,需要继承abc.ABC类,并使用@abc.abstractmethod来装饰抽象方法。例如:


import abcclass Animal(abc.ABC):@abc.abstractmethoddef talk(self):pass

这里我们定义了一个Animal类,并且使用@abc.abstractmethod装饰talk()方法。这个类就是一个抽象类,不能被实例化,只能被其他类继承。

子类继承抽象类时,必须实现父类中的所有抽象方法,否则会抛出TypeError异常。例如:


class Dog(Animal):def talk(self):print("Woof!")class Cat(Animal):def talk(self):print("Meow!")

这里我们定义了两个子类Dog和Cat,它们都继承了Animal类,并且实现了抽象方法talk()。我们可以实例化这些子类,并且调用它们的talk()方法。例如:


dog = Dog()
dog.talk()  # 输出 "Woof!"cat = Cat()
cat.talk()  # 输出 "Meow!"

在Python中,抽象类的作用是规范子类的行为,强制子类遵循一定的规范。通过抽象类,我们可以让代码更加规范和清晰。同时,抽象类也可以作为多态的基础,让代码更加灵活和可扩展。

 为什么要使用抽象类呢?

抽象类的实现

(3)代码实现

"""多态的演示
"""# 这就是抽象类,或者说是接口
class Animal:def speak(self):passclass Dog(Animal):def speak(self):print("汪汪汪")class Cat(Animal):def speak(self):print("喵喵喵")def make_voice(animal: Animal):animal.speak()dog = Dog()
cat = Cat()make_voice(dog)
make_voice(cat)# 演示抽象类
class AC:def cool_wind(self):"""制冷"""passdef hot_wind(self):"""制热"""passdef swing_l_r(self):"""左右摆风"""passclass Midea_AC(AC):def cool_wind(self):"""制冷"""print("美的空调制冷")def hot_wind(self):"""制热"""print("美的空调制热")def swing_l_r(self):"""左右摆风"""print("美的空调左右摆风")class Gree_AC(AC):def cool_wind(self):"""制冷"""print("格力空调制冷")def hot_wind(self):"""制热"""print("格力空调制热")def swing_l_r(self):"""左右摆风"""print("格力空调左右摆风")def make_cool(ac: AC):ac.cool_wind()midea_AC = Midea_AC()
gree_AC = Gree_AC()make_cool(midea_AC)
make_cool(gree_AC)


10.综合案例

(1)案例分析

数据内容 

(2)需求分析

(3)代码实现

1.data_define.py
"""数据定义的类
"""class Record:# 日期date: str = None# 订单idorder_id: str = None# 销售额money: int = None# 销售省份province: str = Nonedef __init__(self, date, order_id, money, province):self.date = dateself.order_id = order_idself.money = moneyself.province = provincedef __str__(self):return f"date:{self.date}, id:{self.order_id},money:{self.money},province:{self.province}"
2.file_define.py
"""文件相关类定义
"""
import jsonfrom data_define import Record# 定义一个抽象类,用于做顶层设计
class FileReader:def read_data(self) -> list[Record]:"""读取文件数据,将每一条数据都转换为Record对象封装到list内返回"""passclass TextFileReader(FileReader):# 文件路径path = Nonedef __init__(self, path):self.path = pathdef read_data(self) -> list[Record]:"""复写读取文件方法:return:"""f = open(self.path, "r", encoding="UTF-8")record_list: list[Record] = []for line in f.readlines():# 消除 \nline = line.strip()data_list = line.split(",")record_list.append(Record(data_list[0],data_list[1],int(data_list[2]),data_list[3]))f.close()return record_listclass JsonFileReader(FileReader):# 文件路径path = Nonedef __init__(self, path):self.path = pathdef read_data(self) -> list[Record]:"""复写读取JSON文件方法:return:"""f = open(self.path, "r", encoding="UTF-8")record_list: list[Record] = []for line in f.readlines():data_dict = json.loads(line)record_list.append(Record(data_dict["date"],data_dict["order_id"],int(data_dict["money"]),data_dict["province"]))f.close()return record_list# 测试代码
if __name__ == '__main__':r = TextFileReader("D:\\IOText\\DataDoing\\2011年1月销售数据.txt")j = JsonFileReader("D:\\IOText\\DataDoing\\2011年2月销售数据JSON.txt")list1 = r.read_data()print(list1[0])list2 = j.read_data()# for r in list1:#     print(r)# for j in list2:#     print(j)
3.main.py
"""主业务逻辑代码
"""
from file_define import FileReader, TextFileReader, JsonFileReader
from data_define import Record
from pyecharts.charts import Bar
from pyecharts.options import *
from pyecharts.globals import ThemeTypetext_file_reader = TextFileReader("D:\\IOText\\DataDoing\\2011年1月销售数据.txt")
json_file_reader = JsonFileReader("D:\\IOText\\DataDoing\\2011年2月销售数据JSON.txt")month_1_data: list[Record] = text_file_reader.read_data()
month_2_data: list[Record] = json_file_reader.read_data()# 将两个月份的数据合并
all_data: list[Record] = month_1_data + month_2_data
# 开始进行数据计算
data_dict = {}
for record in all_data:if record.date in data_dict.keys():# 累加data_dict[record.date] += record.moneyelse:# 创建data_dict[record.date] = record.money# 可视化
bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT)
)
# 添加x轴的数据
bar.add_xaxis(list(data_dict.keys()))
# 添加Y轴的数据
bar.add_yaxis("销售额", list(data_dict.values()), label_opts=LabelOpts(is_show=False))bar.set_global_opts(title_opts=TitleOpts(title="每日销售额")
)
bar.render("每日销售额.html")

结语

学这么点内容,学习了一天,确实是不用着急,不要慌张,脚踏实地的一步一步的走就行啦

今天就到这里

拜拜ヾ( ̄▽ ̄)Bye~Bye~

相关文章:

第二阶段第一章——面向对象

前言 学习了这么久Python&#xff08;呃其实也没多久差不多两周&#xff09;&#xff0c;可能有小伙伴说我废了&#xff0c;两周才学这么点&#xff0c;咋说呢&#xff0c;我曾经也是急于求成&#xff0c;做任何事情都是急于求成&#xff0c;比如我喜欢一个人我就想马上跟她在…...

Linux学习第33天:Linux INPUT 子系统实验(二):Linux 自带按键驱动程序的使用

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本节笔记主要内容是学会如何使用Linux自带的按键驱动程序。 一、自带按键驱动程序源码简析 配置选项路径如下&#xff1a; -> Device Drivers ->…...

解决Visual Studio 2010 运行时屏幕一闪而过,无结果显示的问题

安装配置&#xff1a;Visual Studio 2010 软件安装教程&#xff08;附下载链接&#xff09;——计算机二级专用编程软件https://blog.csdn.net/W_Fe5/article/details/134218817?spm1001.2014.3001.5502 1、 我们在运行时会出现窗口一闪而过&#xff0c;这时候我们右键Test_1…...

C++(20):为[[nodiscard]]提供提示信息

C17中引入了[[nodiscard]]以对一些被忽略的函数返回值进行警告。 C(17)&#xff1a;[[nodiscard]]编译属性_[[nodiscard]] c-CSDN博客 C20可以为[[nodiscard]]提供一个可选的提示信息 [[nodiscard("cant ignore")]] int fi() {return 1; }int main() {fi();return 0…...

hi3518ev200 从sd卡启动rootfs

板卡为 hisi 的 hi3518ev200&#xff0c;16M RAM&#xff0c;64M Flash。板卡不支持从SD卡启动&#xff0c;但是由于Flash空间有限&#xff0c;很多应用都放不下&#xff0c;因此考虑把 rootfs 放到 SD 卡中。先从 Flash 中启动 kernel&#xff0c;然后再加载 SD 卡中的 rootfs…...

[BUUCTF NewStar 2023] week5 Crypto/pwn

最后一周几个有难度的题 Crypto last_signin 也是个板子题&#xff0c;不过有些人存的板子没到&#xff0c;所以感觉有难度&#xff0c;毕竟这板子也不是咱自己能写出来的。 给了部分p, p是1024位给了922-101位差两头。 from Crypto.Util.number import * flag b?e 655…...

使用seldom编写http接口用例

在编写接口用例的过程中&#xff0c;针对一个接口&#xff0c;往往只是参数不同&#xff0c;那么参数化就非常有必要了。 seldom 中参数化的用法非常灵活&#xff0c;这里仅介绍file_data() 的N种玩法。 二维列表 当参数比较简单时可以试试下面的方式。 参数化数据 {"…...

Redis中Hash类型的命令

目录 哈希类型的命令 hset hget hexists hdel hkeys hvals hgetall hmget hlen hsetnx hincrby hincrbyfloat 内部编码 Hash类型的应用场景 作为缓存 哈希类型和关系型数据库的两点不同之处 缓存方式对比 Redis自身已经是键值对的结构了,Redis自身的键值对就…...

Java 函数式编程

1.Lambda 1.1 格式 JDK 从 1.8 版本开始支持 Lambda 表达式&#xff0c;通过 Lambda 表达式我们可以将一个函数作为参数传入方法中。在 JDK 1.8 之前&#xff0c;我们只能通过匿名表达式来完成类似的功能&#xff0c;但是匿名表达式比较繁琐&#xff0c;存在大量的模板代码&…...

类的成员函数总结

前言&#xff1a; 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成的…...

java高级之单元测试、反射

1、Junit测试工具 Test定义测试方法 1.被BeforeClass标记的方法,执行在所有方法之前 2.被AfterCalss标记的方法&#xff0c;执行在所有方法之后 3.被Before标记的方法&#xff0c;执行在每一个Test方法之前 4.被After标记的方法&#xff0c;执行在每一个Test方法之后 public …...

MSQL系列(十三) Mysql实战-left/right/inner join 使用详解及索引优化

Mysql实战-left/right/inner join 使用详解及索引优化 前面我们讲解了BTree的索引结构&#xff0c;也详细讲解下Join的底层驱动表 选择原理&#xff0c;今天我们来了解一下为什么会出现内连接外连接&#xff0c;两种连接方式&#xff0c;另外实战一下内连接和几种最常用的join…...

前端面试题之HTML篇

1、src 和 href 的区别 具有src的标签有&#xff1a;script、img、iframe 具有href的标签有&#xff1a;link、a 区别 src 是source的缩写。表示源的意思&#xff0c;指向资源的地址并下载应用到文档中。会阻塞文档的渲染&#xff0c;也就是为什么js脚本放在底部而不是头部的…...

Django ORM:数据库操作的Python化艺术

Django的对象关系映射器&#xff08;ORM&#xff09;是其核心功能之一&#xff0c;允许开发者使用Python代码来定义、操作和查询数据库。这篇文章将带你深入了解Django ORM的强大之处&#xff0c;从基本概念到高级查询技巧&#xff0c;提供丰富的示例帮助你掌握使用Django ORM进…...

react受控组件与非受控组件

React中的组件可以分为受控组件和非受控组件&#xff1a; 受控组件&#xff1a;受控组件是指组件的值受到React组件状态的控制。通常在组件中&#xff0c;我们会通过state来存储组件的值&#xff0c;然后再将state的值传递给组件的props&#xff0c;从而实现组件的双向数据绑定…...

小米产品面试题:淘宝为何需要确认收货?京东为何不需要?

亲爱的小米粉丝们&#xff0c;大家好&#xff01;我是小米&#xff0c;一个热爱技术、热衷于分享的小编。今天&#xff0c;我要和大家聊聊一个有趣的话题&#xff1a;为什么淘宝购物需要确认收货&#xff0c;而京东不需要&#xff1f;这可是一个让很多人纳闷的问题&#xff0c;…...

(1)上位机底部栏 UI如何设置

上位机如果像设置个多页面切换&#xff1a; 位置&#xff1a; 代码如下&#xff1a; "tabBar": {"color": "black","selectedColor": "#d43c33","borderStyle":"black","backgroundColor": …...

中国多主数据库:压强投入,期待破茧

拿破仑曾说&#xff1a;“战争的艺术就是在某一点上集中最大优势兵力”&#xff0c;强调了力量集中的重要性。 如今&#xff0c;国际形势风云变幻&#xff0c;西方世界对中国的围剿不再仅仅体现在军事和地缘政治上&#xff0c;而更多表现在经济与科技上。在科技领域&#xff0…...

JavaScript在ES6及后续新增的常用新特性

JavaScript经历了不同标本的迭代&#xff0c;在不断完善中会添加不同的新特性来解决前一个阶段的瑕疵&#xff0c;让我们开发更加便捷与写法更加简洁&#xff01; 1、箭头函数&#xff1a; 箭头函数相比传统的函数语法&#xff0c;具有更简洁的语法、没有自己的this值、不会绑…...

试试流量回放,不用人工写自动化测试case了

大家好&#xff0c;我是洋子&#xff0c;接触过接口自动化测试的同学都知道&#xff0c;我们一般要基于某种自动化测试框架&#xff0c;编写自动化case&#xff0c;编写自动化case的依据来源于接口文档&#xff0c;对照接口文档里面的请求参数进行人工添加接口自动化case 其实…...

密钥管理系统功能及作用简介 安当加密

密钥管理系统的功能主要包括密钥生成、密钥注入、密钥备份、密钥恢复、密钥更新、密钥导出和服务&#xff0c;以及密钥的销毁等。 密钥生成&#xff1a;通过输入一到多组的密钥种子&#xff0c;按照可再现或不可再现的模式生成所需要的密钥。一般采用不可再现模式作为密钥生成…...

vue中watch属性的用法

在Vue中&#xff0c;watch属性用于监听一个数据的变化&#xff0c;并且在数据变化时执行一些操作。它可以观察一个具体的数据对象&#xff0c;从而在该数据对象发生变化时触发对应的回调函数。 使用watch属性的步骤如下&#xff1a; 在Vue实例中添加一个watch对象 new Vue({…...

Redis-使用java代码操作Redis

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Linux》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这…...

0基础学习PyFlink——事件时间和运行时间的窗口

大纲 定制策略运行策略Reduce完整代码滑动窗口案例参考资料 在 《0基础学习PyFlink——时间滚动窗口(Tumbling Time Windows)》一文中&#xff0c;我们使用的是运行时间(Tumbling ProcessingTimeWindows)作为窗口的参考时间&#xff1a; reducedkeyed.window(TumblingProcess…...

Git Rebase 优化项目历史

在软件开发过程中&#xff0c;版本控制是必不可少的一环。Git作为当前最流行的版本控制系统&#xff0c;为开发者提供了强大的工具来管理和维护代码历史。git rebase是其中一个高级特性&#xff0c;它可以用来重新整理提交历史&#xff0c;使之更加清晰和线性。本文将详细介绍g…...

两种MySQL OCP认证应该如何选?

很多同学都找姚远老师说要参加MySQL OCP认证培训&#xff0c;但绝大部分同学并不知道MySQL OCP认证有两种&#xff0c;以MySQL 8.0为例。 一种是管理方向&#xff0c;叫&#xff1a;Oracle Certified Professional, MySQL 8.0 Database Administrator&#xff08;我考试的比较…...

Java用log4j写日志

日志可以方便追踪和调试问题&#xff0c;以前用log4net写日志&#xff0c;换Java了改用log4j写日志&#xff0c;用法和log4net差不多。 到apache包下载下载log4j的包&#xff0c;解压后把下图两个jar包引入工程 先到网站根下加一个log4j2.xml的配置文件来配置日志的格式和参…...

PCTA认证考试-01_TiDB数据库架构概述

TiDB 数据库架构概述 一、学习目标 理解 TiDB 数据库整体结构。了解 TiDB Server&#xff0c;TiKV&#xff0c;TiFlash 和 PD 的主要功能。 二、TiDB 体系架构 1. TiDB Server 2. TiKV OLTP 3. Placement Driver 4. TiFlash OLAP OLTPOLAPHTAP...

路由过滤路由引入

目录 一、实验拓扑 二、实验需求 三、实验步骤 1、配置IP地址 2、配置RIP和OSPF 3、配置路由引入 4、使用路由过滤&#xff0c;使 R4 无法学到 R1 的业务网段路由&#xff0c;要求使用 prefix-list 进行匹配 5、OSPF 区域中不能出现 RIP 协议报文 一、实验拓扑 二、实…...

视频剪辑技巧:批量合并视频,高效省时,添加背景音乐提升品质

随着社交媒体的兴起&#xff0c;视频制作越来越受到人们的关注。掌握一些视频剪辑技巧&#xff0c;可以让我们轻松地制作出令人惊艳的视频。本文将介绍一种高效、省时的视频剪辑技巧&#xff0c;帮助您批量合并视频、添加背景音乐&#xff0c;并提升视频品质。现在一起来看看云…...