面向对象(下)

7.继承

继承的基础语法

学习目标:理解继承的概念,掌握继承的使用方式,掌握pass关键字的作用

就是把老的设计图继承下来,然后修修改改成为新的设计图

我们可以使用继承,来完成此需求。

单继承

从头写一个新的类:

基于原有的类进行修改:

我们可以通过继承来只关心新的功能,老的功能你压根就不需要关心,只需要通过继承的写法,全部就都过来了

单继承基础语法:

被继承的类我们把它称作父类,继承别人的我们把它称作子类,子类的功能都是从父类那里继承而来的。子类构建的类对象,可以有自己的成员变量和成员方法,使用父类的成员变量和成员方法。

继承分为单继承和多继承。

继承表示:将从父类那里继承(复制)来成员变量和成员方法(不含私有)

可以看到我在2022里面没有写原来的功能,但是我继承了原来的功能后,也可以直接使用

多继承

单继承是指一个子类继承了一个父类,多继承就表明一个子类它继承了多个父类。

pass只是一个普通的占位语句,没有实际的功能,表示无内容,空的意思,它的作用只是补全我们的语法,让计算机不报错。

多继承的注意事项:多个父类在,如果有同名的成员,那么默认以继承顺序(从左到右)为优先级。即:先继承的保留,后继承的被覆盖。

# 演示面向对象:继承的基础语法
# 演示多继承
class Phone:IMEI = None   # 序列号producer = "HM" # 厂商def call_by_4g(self):print("4g通话")
class NFCReader:nfc_type = "第五代"producer = "itcast"def read_card(self):print("NFC读卡")def write_card(self):print("NFC写卡")
class RemoteControl:rc_type = "红外遥控"def control(self):print("红外遥控开启了")
class MyPhone(Phone,NFCReader,RemoteControl):passphone = MyPhone()
phone.call_by_4g()
phone.read_card()
phone.write_card()
phone.control()
print(phone.producer)

谁先来的谁优先级高

复写和调用父类成员

学习目标:掌握复习父类成员的语法,掌握如何在子类中调用父类成员。

复写

对父类的成员属性或成员方法进行重新定义。

就是重新定义一下就可以了

复写的语法:在子类中重新实现同名成员方法或成员属性即可

class Phone:IMEI = None   # 序列号producer = "ITCAST"def call_by_5g(self):print("使用5g网络进行通话")
# 定义子类,复写父类成员
class MyPhone(Phone):producer = "itheima" # 复写父类的成员属性def call_by_5g(self):print("开启CPU单核模式,确保通话得时候省电")print("使用5g网络进行通话")print("关闭CPU单核模式,确保性能")
phone = MyPhone()
phone.call_by_5g()
print(phone.producer)

调用父类同名成员

class Phone:IMEI = None   # 序列号producer = "ITCAST"def call_by_5g(self):print("使用5g网络进行通话")
# 定义子类,复写父类成员
class MyPhone(Phone):producer = "itheima" # 复写父类的成员属性def call_by_5g(self):print("开启CPU单核模式,确保通话得时候省电")# 方式二print(f"父类的厂商是:{super().producer}")super().call_by_5g()print("关闭CPU单核模式,确保性能")
phone = MyPhone()
phone.call_by_5g()
print(phone.producer)

就是通过调用父类成员的形式,可以拿到被子类所复写的父类里面的内容。

注意:只可以在子类内部调用父类的同名成员,子类的实体类对象调用默认是调用子类复写的。

8.类型注解

变量的类型注解

学习目标:理解为什么使用类型注解,掌握变量的类型注解语法。

就是说:pycharm会确定这是一个什么类型,然后帮助我们推断出来里面有什么方法。

因为pycharm无法通过代码,确定应外部传入什么类型,我们需要使用类型注解。

给变量注释一个类型:

列表、集合类型设置类型详细注解,需要写列表内部是什么类型

容器类型详细注解使用[]

标记黄色下划线只是因为我们在pycharm中标记了重名变量。

这个黄色只是用来提示我们出现重名了。

alt+回车键可以自动搜索导包,帮助我们自动导包

我们可以看到注释中type:后面的int变亮了

# 演示变量的类型注解
import json
import random# 基础数据类型注解
var_1:int = 10  # 表示var_1变量里面存储的数据是int整形
var_2:str = "itheima"
var_3:bool = True
# 类对象类型注解
class Student:pass
stu:Student = Student()   # 表示stu是Student这个类的类型
# 基础容器类型注解
my_list:list = [1,2,3]
my_tuple:tuple = (1,2,3)
my_dict:dict = {"itheima":666}
# 容器类型详细注解
my_list:list[int] = [1,2,3]
my_tuple:tuple[int,str,bool] = (1,"itheima",True)
my_dict:dict[str,int] = {"itheima":666}
# 在注释中进行类型注解
var_1 = random.randint(1,10)   # type:int
var_2 = json.loads('{"name":"zzzz"}')   # type:dict[str,str]
def func():return 10
var_3 = func()   # type:int
# 类型注解的限制
var_4:int = "ikun"
var_5:str = 123

类型注解其实仅仅只是一个备注,它压根不会影响到我们程序的运行,所以你哪怕标记错了也没有关系

总结:

函数(方法)的类型注解

学习目标:掌握为函数(方法)形参进行类型注解,掌握为函数(方法)返回值进行类型注解

这个注解都不是强制性的,只是建议性的。

总结

->  这就是一个减号和一个大于号

Union类型

学习目标:理解Union类型,掌握使用Union进行联合类型注解

使用Union[类型,......,类型]

可以定义联合类型注解

总结:

记得导包,U大写,中括号[]

9.多态

学习目标:理解多态的概念,理解抽象类(接口)的编程思想

使用同样的函数(行为),给他传入不同的对象,你就得到不同的状态了

# 演示面向对象的多态特性以及抽象类(接口)的使用class Animal:def speak(self):passclass Dog(Animal):def speak(self):print("汪汪汪")class Cat(Animal):def speak(self):print("喵喵喵")
def make_noise(animal:Animal):# 制作点噪音,需要传入Animal对象animal.speak()
# 演示多态,使用2个子类对象来调用函数
dog = Dog()
cat = Cat()
make_noise(dog)
make_noise(cat)

抽象类其实就是用来做顶层设计,但是我们并不直接使用AC,也就是并不直接使用抽象类,而是使用他的具体子类

这也是强制要求我们子类必须复写父类,不然全是空,无法使用

class AC:def cool_wind(self):"""制冷"""passdef hot_wind(self):"""制热"""passdef swing_l_r(self):"""左右摆风"""pass
class 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)

我们可以实现做顶层设计也就是标准,然后由具体的类去实现,同时呢也能够完成同一种行为不同的运行状态了。

总结

(1)什么是多态?

多态指的是,同一种行为,使用不同的对象获得不同的状态。如:定义函数(方法),通过类型注解声明需要父类对象,实际传入子类对象进行工作,从而获得不同的工作状态。

(2)什么是抽象类(接口)?

包含抽象方法的类,称之为抽象类。抽象方法是指:没有具体实现的方法(pass)称之为抽象方法。

(3)抽象类的作用

多用于做顶层设计(设计标准),以便子类做具体实现。也是对子类的一种软性约束,要求子类必须复写(实现)父类的一些方法,并配合多态使用,获得不同的工作状态。

10.综合案例(数据分析的案例)

学习目标:使用面向对象思想完成数据读取和处理,基于面向对象思想重新认知第三方库使用(PyEcharts)

只需要把每一天的销售额拿过来,求个和就可以了

实现步骤: 1.设计一个类,可以完成数据的封装 2.设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体功能 3.读取文件,生产数据对象 4.进行数据需求的逻辑计算(计算每一天的销售额) 5.通过PyEcharts进行图形绘制

文件读取

由于文件格式不同,我们读取它的具体实现,它的逻辑是不是也不一样,所以我们需要去构建一个抽象类,先在最顶级我们设计好读取文件应该有哪些基础功能,但我们不实现,然后我们通过具体的子类,比如说文本读取的子类或者json读取的子类,来去实现具体数据的具体读取方法

写一部分检查一下,你会发现中间空了一个,因为每一行有一个\n,你直接print这个\n就会出现换行

line = line.strip()
加入这行代码,删除\n即可

数据统计

假设有一个字典,字典里面记录的有key和value,我们的key就是日期,比如是2011年1月1日,这个key,然后记录的value,可能是它的今天的销售额,我们可以通过for循环,挨个取它里面的数据,如果取到的某一个Record里面的日期呢,是1月1号,就到字典里面看一看有没有1月1号这个key,如果有的话,就把记录的这个销售额和我当前记录的进行一个累加,然后继续for循环,出现1月1号就把它加起来,那如果我们取到的是1月2号这个key不存在,我们就给它里面再加一个新key,然后值就是你当前取到这个Record里面记录的,然后继续循环,遇到1月2号就累加......

字典的key是不会重复的,就可以判断里面有没有key,有的话就表明你已经有累加的记录了,直接把当前值给你累加上去,如果没有的话,那表明我是当前这个日期的第一条,然后把我当前的数据放进去。

统计出了每一天的销售额

可视化开发

依旧是之前构建动态柱状图的方法

if __name__ == '__main__':

这段代码意思是后面的代码只在本文件中有效,别的文件导包这个文件无效

相信大家思路都差不多了,接下来看代码!

完整代码

# 数据定义的类class Record:   # 用来记录数据的基本信息def __init__(self,date,order_id,money,province):self.date = date     # 订单日期self.order_id = order_id  # 订单idself.money = money     # 订单金额self.province = province   # 销售省份def __str__(self):return f"{self.date},{self.order_id},{self.money},{self.province}"

"""
和文件相关的类定义
"""
from data_define import Record
import json
# 先定义一个抽象类用来做顶层设计,确定有哪些功能需要实现
class FileReader:def read_data(self) -> list[Record]:"""读取文件的数据,读到的每一条数据都转换为Record对象,将它们都封装到list内返回即可"""pass
class TexFileReader(FileReader):def __init__(self,path):self.path = path   # 定义成员变量记录文件的路径# 复写(实现抽象方法)父类的方法def read_data(self) -> list[Record]:f = open(self.path,"r",encoding="UTF-8")record_list:list[Record] = []for line in f.readlines():line = line.strip()  # 消除读取到的每一行数据中的\ndata_list = line.split(",")record = Record(data_list[0],data_list[1],int(data_list[2]),data_list[3])record_list.append(record)f.close()return record_list
class JsonFileReader(FileReader):def __init__(self,path):self.path = path   # 定义成员变量记录文件的路径# 复写(实现抽象方法)父类的方法def read_data(self) -> list[Record]:f = open(self.path, "r", encoding="UTF-8")record_list: list[Record] = []for line in f.readlines():data_dict = json.loads(line)record = Record(data_dict["date"], data_dict["order_id"], data_dict["money"], data_dict["province"])record_list.append(record)f.close()return record_list
if __name__ == '__main__':text_file_reader = TexFileReader("D:/2011年1月销售数据(1)(1).txt")json_file_reader = JsonFileReader("D:/2011年2月销售数据JSON(2).txt")list1 = text_file_reader.read_data()list2 = json_file_reader.read_data()for l in list1:print(l)for h in list2:print(h)

# 面向对象,数据开发案例,主业务逻辑代码
"""
实现步骤:
1.设计一个类,可以完成数据的封装
2.设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体功能
3.读取文件,生产数据对象
4.进行数据需求的逻辑计算(计算每一天的销售额)
5.通过PyEcharts进行图形绘制
"""
from file_define import FileReader,JsonFileReader,TexFileReader
from data_define import Record
from pyecharts.charts import Bar
from pyecharts.options import *
from pyecharts.globals import ThemeType
text_file_reader = TexFileReader("D:/2011年1月销售数据(1)(1).txt")
json_file_reader = JsonFileReader("D:/2011年2月销售数据JSON(2).txt")
jan_data:list[Record] = text_file_reader.read_data()  # 一月份数据
feb_data:list[Record] = json_file_reader.read_data()  # 二月份数据
# 将2个月份的数据合并为1个list来存储
all_data:list[Record] = jan_data + feb_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))  # 设置主题颜色
bar.add_xaxis(list(data_dict.keys()))  # 添加x轴数据
bar.add_yaxis("销售额",list(data_dict.values()),label_opts=LabelOpts(is_show=False))   # 添加y轴数据  让数据不显示
bar.set_global_opts(title_opts=TitleOpts(title="每日销售额")
)
bar.render("每日销售额柱状图.html")

效果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/459052.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用Django实现MySQL数据库的内容在网页的增删改写

利用Django实现MySQL数据库的内容在网页的增删改写 1.建立项目2.定义模型3.创建视图4.创建模板5.创建表单和配置url6.最后修改7.效果 1.建立项目 输入命令django-admin startproject aaa 新建项目,项目名称命名为aaa,打开aaa文件夹,命令提示…

Puppeteer 与浏览器版本兼容性:自动化测试的最佳实践

Puppeteer 支持的浏览器版本映射:从 v20.0.0 到 v23.6.0 自 Puppeteer v20.0.0 起,这个强大的自动化库开始支持与 Chrome 浏览器的无头模式和有头模式共享相同代码路径,为自动化测试带来了更多便利。从 v23.0.0 开始,Puppeteer 进…

大白话讲解分布式事务-SEATA事务四种模式(内含demo)

因为这里主要是讲解分布式事务,关于什么是事务,以及事务的特性,单个事务的使用方式,以及在Spring框架下,事务的传播方式,这里就不再赘述了。但是我这里要补充一点就是,一提到事务大家脑子里第一…

【LLM论文日更 | 一种引入上下文的文档嵌入方法 】

论文:​​​​​​​https://arxiv.org/pdf/2410.02525代码:暂未开源机构:康奈尔大学领域:embedding model发表:arxiv 研究背景 研究问题:这篇文章要解决的问题是如何改进文档嵌入,使其在特定上…

短短一年多,ChatGPT 发展到什么程序了?

短短一年多,ChatGPT 就与 Google、Youtube、X.com等大佬级网站比肩。成为全球访问量最大的网站之一 爆发期,访问量月增长率高达3000%左右。网站流量从1800万次访问激增至6.72亿次只花了60来天。 2023年一项AI产品访问量统计结果中ChatGPT占比60%&#xf…

信号反射与振铃

反射来源于阻抗不匹配,振铃就是多次反射 对于反射要记住传输系数与反射系数 传输系数与反射系数 振铃现象计算说明

Python轴承故障诊断 (15)基于CNN-Transformer的一维故障信号识别模型

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…

Spark原理

主要包括: 核心组件的运行机制(Master,Worker,SparkContext等)任务调度的原理Shuffile的原理内存管理数据倾斜处理Spark优化 核心组件的运行机制 Spark 执行任务的原理: Spark on Yarn: Cluster模型&am…

【数据结构-邻项消除】力扣1003. 检查替换后的词是否有效

给你一个字符串 s ,请你判断它是否 有效 。 字符串 s 有效 需要满足:假设开始有一个空字符串 t “” ,你可以执行 任意次 下述操作将 t 转换为 s : 将字符串 “abc” 插入到 t 中的任意位置。形式上,t 变为 tleft “…

GPT-4o 和 GPT-4 Turbo 模型之间的对比

GPT-4o 和 GPT-4 Turbo 之间的对比 备注 要弄 AI ,不同模型之间的对比就比较重要。 GPT-4o 是 GPT-4 Turbo 的升级版本,能够提供比 GPT-4 Turbo 更多的内容和信息,但成功相对来说更高一些。 第三方引用 在 2024 年 5 月 13 日&#xff0…

115页PPT华为管理变革:制度创新与文化塑造的核心实践

集成供应链(ISC)体系 集成供应链(ISC)体系是英文Integrated Supply Chain的缩写,是一种先进的管理思想,它指的是由相互间提供原材料、零部件、产品和服务的供应商、合作商、制造商、分销商、零售商、顾客等…

TCP simultaneous open测试

源代码 /*************************************************************************> File Name: common.h> Author: hsz> Brief:> Created Time: 2024年10月23日 星期三 09时47分51秒**********************************************************************…

ctfshow(175->178)--SQL注入--联合注入及其过滤

Web175 进入界面: 审计: 查询语句: $sql "select username,password from ctfshow_user5 where username !flag and id ".$_GET[id]." limit 1;";返回逻辑: if(!preg_match(/[\x00-\x7f]/i, json_enc…

可编辑PPT | 柔性制造企业数字化转型与智能工厂建设方案

这份PPT介绍了柔性制造企业在数字化转型和智能工厂建设方面的综合方案。探讨了数据采集、数字孪生、无码开发支撑、数据资产和应用能力层的构建,以及企业信息化的新思路。最终目标是通过这些技术和策略,实现供应链协同、产品全生命周期管理、绿色节能生产…

VUE, element-plus, table分页表格列增加下拉筛选多选框,请求后台

简介 为了方便表格查询时可以筛选列的值,需要给列增加筛选框(多选框),element-plus提供了列的filter字段,但是基于表格数据的筛选,不会重新请求后台,而且当前表格数据有多少个条目,…

WPF+MVVM案例实战(一)- 设备状态LED灯变化实现

文章目录 1、项目创建2、UI界面布局1. MainWindow.xaml2、颜色转换器实现2.MainViewModel.cs 代码实现 3、运行效果4.源代码下载 1、项目创建 打开 VS2022 ,新建项目 Wpf_Examples,创建各层级文件夹,安装 CommunityToolkit.Mvvm 和 Microsof…

python实现投影仪自动对焦

这是一款投影仪,它带有对焦摄像头 它是如何自动对焦的呢? 我们先看一下对焦算法展示效果 说明:左侧是原视频,右侧是对调焦后的视频帧展示,如果下一帧视频比当前帧清晰就会显示下一帧,否则,还是显示当前帧,直至找到更清晰的帧 原理说明: 在投影仪上对焦摄像头就会实…

HelloCTF [RCE-labs] Level 4 - SHELL 运算符

开启靶场,打开链接: 源码很简单,system("ping -c 1 $ip"); GET传参ip 构造payload: /?ip127.0.0.1;ls / /?ip127.0.0.1;cat /flag 成功得到flag: NSSCTF{04ad1d48-4530-481d-aa5d-8a153b0ebf2c}

常见学习陷阱及解决方案

文章目录 1. 拖延2. 信息过载3. 缺乏计划4. 过度依赖记忆5. 缺乏反馈6. 学习环境不佳7. 不够自信8. 不适合的学习方法结论 在学习过程中,学生常常会遇到各种陷阱,这些陷阱可能会影响学习效果和动机。以下是一些常见的学习陷阱及其解决方案: 1…

软硬链接_动静态库

软硬链接 软链接创建 硬链接创建 软链接是独立文件(独立inode号) 硬链接不是独立文件(inode和目标相同) 如何理解软硬链接 软链接有独立inode,软链接内容上,保存的是文件路径 硬链接不是独立文件&#xf…