Python—面向对象小解(3)

一、多态

多态指的是一类事物的多中形态

相同的方法,产生不同的执行结果

运算符 + * 的多态

int + int 加法计算

str + str 字符串拼接

list + list 列表的数据合并

在python中可以使用类实现一个多态效果

在python中使用重写的方式实现多态

(1)定义两个类:老师、车;

(2)定义老师类的属性:姓名,定义老师类的方法:开车、停车;

(3)定义车类的属性:类型,定义车类的方法:开启、停止;

(4)联系:老师开车,执行程序,观察效果

# 多态
class Teacher:def __init__(self,name):self.name = namedef run(self):print(f'{self.name}老师开车')def stop(self):print(f'{self.name}老师停车')class Car:def __init__(self,type):self.type = typedef start(self):print(f'{self.type}启动')def close(self):print(f'{self.type}熄火')t = Teacher('张三')
c = Car('小汽车')c.start()
t.run()
c.close()
t.stop()#使用继承方式,调整执行的方法
# 多态
class Teacher:def __init__(self,name):self.name = namedef run(self):print(f'{self.name}老师开车')def stop(self):print(f'{self.name}老师停车')class Car(Teacher):def __init__(self,type,name):super().__init__(name)self.type = typedef start(self):print(f'{self.type}启动')super().run()def close(self):print(f'{self.type}熄火')super().stop()c = Car('小汽车','张三')c.start()
c.close()

(5)思考:老师有可能开小轿车、骑自行车、坐地铁等,该怎么改进程序呢?

多态实现的流程:

1-定义一个父类,在父类中定义需要执行的业务方法,具体方法的逻辑不用实现,直接pass,由继承的子类实现

2-定义多个功能的子类继承父类,在子类中对父类方法重写,实现自己子类的逻辑

3-封装一个统一的函数处理方法,让开发人员调用该方法

# 多态
class Teacher:def __init__(self,name):self.name = namedef run(self):passdef stop(self):passclass Car(Teacher):def __init__(self,type,name):super().__init__(name)self.type = typedef run(self):# 在多态实现时,子类继承父类并对父类方法进行重写print(f'{self.type}启动')print(f'{self.name}老师开车')def stop(self):print(f'{self.type}熄火')print(f'{self.name}老师停车')class Metro(Teacher):def __init__(self,type,name):super().__init__(name)self.type = typedef run(self):# 在多态实现时,子类继承父类并对父类方法进行重写print(f'{self.type}启动')print(f'{self.name}老师乘坐地铁')def stop(self):print(f'{self.type}到站')print(f'{self.name}老师下车')# 单独封装一个行为函数
# 该函数就是对外提供一个函数接口,其他开发人员使用,就调用函数
def action(obj):# obj接收一个对象obj.run()obj.stop()c = Car('越野车','张三')
action(c)m = Metro('地铁1号线','李四')
action(m)

二、文件读写

通过文件读写完成对文件数据的处理

使用python中open方法实现对文件的读写

  • 格式

    • 会返回一个文件描述符

    • 使用文件描述符进行数据的读取或写入

f = open(文件位置,读写方式,文件读写格式(utf-8,gbk))data = f.read() 读取
f.write(数据) 写入f.close() 关闭文件

2-1 文件数据读取

# 文件数据读取
# 1-打开文件 创建文件描述符
# open的第一个参数指定读取的文件路径  可以使用绝对路径  也可以使用相对路径  windos的路径需要改斜杠
# 第二参数指定读写方式  r读 w写
# 第三个参数指定文件编码格式,方便读取中文数据  常用的两种utf-8  gbk
f = open('路径','r',encoding='utf-8')# 读取数据文件
# 第一种 读取一行数据
# line_data1 = f.readline()
# print(line_data1)
# line_data2 = f.readline()
# print(line_data2)# 第二种读取多行数据  将读取的多行数据放入列表中  该方式最常用
lines_data = f.readlines()
print(lines_data)# 第三种  一次将所有数据读取出来当成一个完整的字符串数据  前面已经读取过数据 read就无法再读到数据 所以在实际开发中三种方式选择一种
# data = f.read()
# print(data)
# print(type(data))# 数据取完成后可以使用close方法关闭文件
f.close()

2-2 数据写入文件

  • 写入方式

    • w 覆盖写入数据

    • a 追加写入数据

  • 写入类型

    • 要求写入数据是字符串类型

# 文件数据写入
# 1-先打开文件获取文件描述符  文件描述符用来操作文件
# 使用相对路径   代码文件运行的所在路径
# csv文件是以逗号分割的数据文件  可以使用excel打开
# w是覆盖写入数据  a是追加写入数据
f = open('./data.csv','a',encoding='utf-8')# 写入数据
f.write('3,王五,20,男')
f.write('\n') # 写入换行符  进行换行
f.write('4,赵六,22,男')
f.write('\n')#关闭文件
f.close()

2-3 二进制文件读写

# 二进制文件数据读写
# 1-打开文件获取文件描述符
f = open('文件路径','rb')# 使用read一次性全部读取
data = f.read()
print(data)
# 关闭文件
f.close()# 打开新的文件,将图片数据保存
f2 = open('./2.jpeg','wb')f2.write(data)f2.close()

2-4 with open 语法 读写文件

# 使用with  open自动关闭文件
with open('文件路径','r',encoding='utf-8') as f:data = f.read()print(data)with open('data.json','w',encoding='utf-8') as f:f.write('{"id":1,"name":"张三"}')f.write('\n')f.write('{"id":2,"name":"李四"}')f.write('\n')
  • 文件后缀

    • txt

    • csv

    • json

    • 文件后缀和文件的数据本身没有直接关系

    • 后缀只是为了说明可以使用那种工具打开该文件,方便识别文件类型

三、异常处理

3-1 常见异常

3.1.1 索引错误

  • 索引下标异常,一般发生在数据取值

3.1.3 字典Key值错误

3.1.3 类型错误

3.1.4 文件错误

# 索引下标取值错误
data = 'itcast'
data[100]# 字典取值错误
data = {'name':'张三'}
data['age']# 类型错误
data = '100'
data2 = 10
data3 = data/data2# 文件读取错误 路径不存在
with open('aaa.txt','r',encoding='utf-8') as f:f.read()

3-2 异常捕获

通过语法捕获代码中的异常,根据异常信息,解决异常的问题,保证代码能持续运行

格式:

try:
    需要捕获遗产干的代码片段,有开发人员自己决定哪些代码需要捕获
except:
    捕获到异常后处理的逻辑

# 进行异常捕获
try:
    # 把出现的错误的代码逻辑放入try的作用域中
    data = 15/0
except:
    # 捕获到异常处理的业务逻辑
    print('异常被捕获')
# 异常被捕获后,可以正常执行后续的逻辑
print('其他代码逻辑')

3-3 指定异常类型捕获

# 可以捕获所有异常
try:data_str = 'itcast'# data_str[100]f = open('aasd.txt','r',encoding='utf-8')
except:# 捕获到异常处理的业务逻辑print('异常被捕获')# 异常被捕获后,可以正常执行后续的逻辑
print('其他代码逻辑')# 捕获固定的异常 处理固定错误
try:# data = 15/0# f = open('aasd.txt', 'r', encoding='utf-8')data_str='itcast'data_str[100]
# 捕获指定异常
except (FileNotFoundError,ZeroDivisionError,IndexError):print('捕获0为除数的异常')
print('其他代码逻辑')

3-4 异常的其他处理

try:data = 15/0# Exception as e 获取异常的错误信息# 可以捕获到异常后输出错误信息
except Exception as e:print('异常被捕获')print(e)
else:print('else  没有异常逻辑')
finally:print('finally :无论是否有异常都执行')

3-5 函数中的异常处理

#在调用函数时进行异常捕获
def func(a,b):data = a + bprint(data)try:# 调用其他开发人员编写的代码处理错误func('10',20)
except Exception as e:print(e)#封装函数时异常捕获
# 函数的异常处理
def func(a, b):data = 0# 在封装的函数内捕获异常try:data = a + bexcept:# 函数内自己处理异常print('异常错误')return data# 调用函数
func(10,'20')#函数内捕获到异常不处理,再传递给掉用函数的地方
# 函数的异常处理
def func(a, b):data = 0# 在封装的函数内捕获异常try:data = a + bexcept:# 将异常的错误信息传递到调用地方 当前没有处理异常raise Exception('函数内计算错误')return data# 调用函数时,捕获函数执行的异常
try:func(10,'20')
except Exception as e:print('异常捕获')print(e)# 多个函数中都要使用的变量可以定义成全局变量,通过global声明,就可在多个函数就可以共享全局数据
name_list = []
password_list = []# 登录注册功能
def login():# 函数作用域# 通过四个空格,来确认函数所执行的逻辑从哪里开始# 列表,元组,集合,字典数据可以省略global声明15/0global name_listglobal password_listfor num in range(3):  # [0,3)  0,1,2name = input('请输入用户名:')password = input('请输入密码:')# 先判断用户名是否正确if name in name_list:# 在判断密码是否正确if password in password_list:print('登录成功')# 适应break关键,会结束循环,不再进行取值breakelse:print('密码不正确')else:print('用户名不正确')def register():global name_listglobal password_listname = input('请输入注册的用户名:')password = input('请输入出注册的密码:')# 将用户的名字和密码添加到全局的数据列表name_list.append(name)password_list.append(password)while 1==1:num = input('1-登录 2-注册 3-支付 4-下单 5-退出程序:')if num == '1':# 函数功能的调用try:login()  # 函数名()except:print('登录出现错误')elif num == '2':register()elif num == '3':passelif num == '4':passelse:break

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

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

相关文章

飞腾D2000+FPGA云终端,实现从硬件、操作系统到应用的完全国产、自主、可控

飞腾云终端基于国产化飞腾高性能8核D2000处理器平台的国产自主可控解决方案,搭载昆仑国产化固件,支持UOS、银河麒麟等国产操作系统,满足国产化信息安全运算的需求,实现从硬件、操作系统到应用的完全国产、自主、可控,是国产信息安…

WireShark抓包软件的使用 上海商学院 计算机网络 实验作业3

实验目的 (1)熟悉wireShark软件操作界面和操作步骤; (2)学会捕获过滤器的设置方法; (3)学会显示过滤器的设置方法; (4)学会使用捕获报文的统计…

20231911 2023-2024-2 《网络攻防实践》实践十一报告

实践内容 (1)web浏览器渗透攻击 任务:使用攻击机和Windows靶机进行浏览器渗透攻击实验,体验网页木马构造及实施浏览器攻击的实际过程。 实验步骤: ①选择使用Metasploit中的MS06-014渗透攻击模块②选择PAYLOAD为任意…

Linux基本命令的使用(mkdir)

一、Linux必备命令之mkdir • mkdir命令主要用于创建目录 • 语法: mkdir [选项] 目录名称 若指定目录不存在则创建目录; 选项: -p,--parents 需要时创建目录的上层目录,若这些 目录已存在也不当作错误处理 二、Linux必备命令之…

java基础-chapter15(io流)

io流:存储和读取数据的解决方案 I:input O:output io流的作用:用于读写数据(本地文件,网络) io流按照流向可以分为: 输出流:程序->文件 输入流:文件->程序 io流按照操作文件…

nginx的安装002

之前001讲述了nginxyum安装现在讲一下nginx如何本地离线安装 操作系统: CentOS Stream 9 操作步骤: 首先访问nginx官网,下载。 用wget命令下载, [rootlocalhost ~]# wget -c https://nginx.org/download/nginx-1.26.0.tar.gz …

python基础(习题、资料)

免费提取资料: 练习、资料免费提取。持续更新迅雷云盘https://pan.xunlei.com/s/VNz6kH1EXQtK8j-wwwz_c0k8A1?pwdrj2x# 本文为Python的进阶知识合辑,包括列表(List)、元组(Tuple)、字典(Dic…

四川景源畅信:抖音开店怎么做好运营?

在数字化时代的浪潮中,抖音作为一个流量巨大的社交平台,为许多商家提供了展示和销售产品的新舞台。但在这个充满竞争的平台上,如何做好店铺运营,吸引并留住顾客,成为了许多商家面临的挑战。接下来的内容将围绕如何在抖…

程序启动端口占用问题 cause: Address already in use: bind

1、winr打开cmd窗口 2、找到占用端口的进程号 netstat -aon|findstr "20792" 3、终止进程 taskkill /T /F /PID 18208

实验---DC-AC逆变器(1)---EG8010+NSI6602驱动IGBT实验

一、设计电路 1.LCC 主回路模块原理图 1.1 电源部分 这个电源部分电路图是一个简单而有效的DC-DC转换器设计,包含输入保护和滤波、电源模块、以及输出滤波和稳定。 a. 输入电源部分 输入电源 (E12V): 电路从E12V端子接收12V的直流电源。这是整个电路的输入电源。…

活动选择问题(贪心法)

目录 问题概述 实例分析 代码实现 问题概述 实例分析 求解蓄栏保留问题。农场有n头牛,每头牛会有一个特定的时间区间[b,e]在蓄栏里挤牛奶,并且一个蓄栏里任何时刻只能有一头牛挤奶。现在农场主希望知道最少蓄栏能够满足上述要求,并给出每头牛被安排的方案。对于多种可行方案…

36个JavaScript特效教程,学完即精通

课程目录 🧑‍💻36个JavaScript特效教程,学完即精通 🎁【更多好课】资源仓库,海量资源,无偿分享√ 本站所有素材均来自于互联网,版权属原著所有,如有需要请购买正版。如有侵权&…

【康耐视国产案例】智能AI相机联合OSARO为Zenni眼镜实现订单履约自动化

在电商潮流下,Zenni眼镜作为全球领先的在线眼镜零售商,每年销售超过600万副眼镜,却面临着一个独特而复杂的问题——需要通过扫描眼镜盒内的条形码来处理订单。传统手动处理已经到达流程瓶颈,急需一种更加自动化、可扩展的方法。为…

Hive-因精度丢失导致的 join 数据异常

一、问题复现 不知你是否遇到过 join 结果明显不匹配的情况,例如on t1.join_key t2.join_key中两个join_key明显不相等,但 join 的结果却将其匹配在一起。今日博主在通过用户 id 关联获取用户信息时发现一个用户 id 可以在用户维表中匹配出若干条&…

学生如何获取SOLIDWORKS产品技术支持

在当今日益复杂的学习环境中,技术软件如SOLIDWORKS已成为工程设计和制造类专业学生的重要工具。然而,面对这款功能强大的软件,学生们在使用过程中难免会遇到各种技术难题。那么,作为学生,我们该如何获取SOLIDWORKS产品…

imx6ull - 制作烧录SD卡

1、参考NXP官方的手册《i.MX_Linux_Users_Guide.pdf》的这一章节: 1、SD卡分区 提示:我们常用的SD卡一个扇区的大小是512字节。 先说一下i.MX6ULL使用SD卡启动时的分区情况,NXP官方给的镜像布局结构如下所示: 可以看到&#xff0c…

机器人控制系列教程之D-H参数建模法

机器人运动学的研究依赖于机器人的模型的建立,目前较为多见的两种方法分别是Denavit-Hartenberg建模法(简称:D-H建模法)。该方法时由Denavit和Hartenberg于19955年提出的一种为关节链中的每一个杆件建立一个坐标系的矩阵方法&…

LeetCode-131 分割回文串

LeetCode-131 分割回文串 题目描述解题思路C 代码 题目描述 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。返回 s 所有可能的分割方案。 示例 1: 输入:s “aab” 输出:[[“a”,“a”,“b”],…

HTML跳动的爱心

目录 写在前面 HTML简介 跳动的爱心 代码分析 运行结果

AI大模型简史:萌芽、沉淀、爆发!

近一年来,随着ChatGPT爆火,大模型热潮席卷全球并持续升温,国内越来越多的知名高校、科研院所和创新型企业加大研究力度,大模型技术不断迭代升级,模型能力不断加强,逐渐形成从底层算力、模型开发到行业应用的…