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
相关文章:

Python—面向对象小解(3)
一、多态 多态指的是一类事物的多中形态 相同的方法,产生不同的执行结果 运算符 * 的多态 int int 加法计算 str str 字符串拼接 list list 列表的数据合并 在python中可以使用类实现一个多态效果 在python中使用重写的方式实现多态 (1)定…...
Nginx超时时间
Nginx是一款自由、开源、高性能的HTTP和反向代理服务器,它可以通过不同的设置来提高网站的性能和安全性。其中,设置Nginx超时时间非常重要,因为它将直接影响网站的响应速度和用户体验。本文将从多个方面详细阐述Nginx超时时间的设置方法与注意…...
Imgs,GT,Edge,Gradient_all,Gradient_Foreground
保存一下: 做个记录: import cv2 import os import numpy as np# 对整张图片做canny检测 得到纹理图 def canny_all(input_path, output_path):# 遍历文件夹中的所有文件for filename in os.listdir(input_path):# 构造完整的文件路径image_path os.p…...
自学成才Flutter 弹性布局、线性布局
本文我们要介绍 Flutter 中布局 Widget,包括弹性布局、线性布局 流式布局和层叠布局。 Flutter中文网 Flutter开发 一、弹性布局--Flex Flex 类似 Android 中的 FlexboxLayout,和 Expanded 配合使用可以实现子Widget 按照一定比例来分配父容器空间。 使…...

Part 3.1 深度优先搜索
深度优先搜索(DFS),即按照深度优先的顺序搜索的算法。 深度优先搜索一般使用栈来实现。 [USACO1.5] 八皇后 Checker Challenge 题目描述 一个如下的 6 6 6 \times 6 66 的跳棋棋盘,有六个棋子被放置在棋盘上,使得…...

前端Vue小兔鲜儿电商项目实战Day03
一、Home - 整体结构搭建和分类实现 1. 页面结构 ①按照结构新增5个组件,准备最简单的模板,分别在Home模块的入口组件中引入 src/views/Home/components/ HomeCategory.vue HomeBanner.vue HomeNew.vue HomeHot.vue HomeProduct.vue <script …...
ORACLE 查询SQL优化
1 使用EXPLAIN PLAN 使用EXPLAIN PLAN查看查询的执行计划,这可以帮助你理解查询是如何被Oracle执行的。基于执行计划,你可以确定是否存在索引缺失、不必要的全表扫描等问题。 以下是几种使用EXPLAIN PLAN的方法: 使用EXPLAIN PLAN FOR: 你可以…...

Ansible03-Ansible Playbook剧本详解
目录 写在前面5. Ansible Playbook 剧本5.1 YAML语法5.1.1 语法规定5.1.2 示例5.1.3 YAML数据类型 5.2 Playbook组件5.3 Playbook 案例5.3.1 Playbook语句5.3.2 Playbook1 分发hosts文件5.3.3 Playbook2 分发软件包,安装软件包,启动服务5.3.3.1 任务拆解…...

Qt-qrencode生成二维码
Qt-qrencode开发-生成二维码📀 文章目录 Qt-qrencode开发-生成二维码📀[toc]1、概述📸2、实现效果💽3、编译qrencode🔍4、在QT中引入编译为静态库的QRencode5、在Qt中直接使用QRencode源码6、在Qt中使用QRencode生成二…...
长安链使用Golang编写智能合约教程(三)
本篇主要介绍长安链Go SDK写智能合约的一些常见方法的使用方法或介绍 资料来源: 官方文档官方示例合约库 官方SDK接口文档 教程一:智能合约编写1 教程二:智能合约编写2 一、获取参数、获取状态、获取历史记录的方法解析 注意! …...

Vercel deploy- Nextjs project error-URL link-env variable
Vercel deploy- Nextjs project error-URL link-env variable Error Check Database URL Check next-auth URL NEXTAUTH_URLhttps://yourappname.vercel.app/ 依次排查可能性 Application error: a server-side exception has occurred (see the server logs for more in…...

Java | Leetcode Java题解之第123题买卖股票的最佳时机III
题目: 题解: class Solution {public int maxProfit(int[] prices) {int n prices.length;int buy1 -prices[0], sell1 0;int buy2 -prices[0], sell2 0;for (int i 1; i < n; i) {buy1 Math.max(buy1, -prices[i]);sell1 Math.max(sell1, b…...

Ubuntu22.04之扩展并挂载4T硬盘(二百三十三)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...
Redis实现延迟队列
最近用到一个延迟消息的功能,第一时间想到使用MQ或者MQ的插件,因为数据量不大,所以尝试使用Redis来实现了,毕竟Redis也天生支持类似MQ的队列消费,所以,在这里总结了一下Redis实现延迟消息队列的方式。 一、…...

如何准确查找论文数据库?
在学术研究过程中,查找相关论文是获取最新研究成果、支持自己研究的重要途径。准确查找论文数据库不仅可以节省时间,还能确保找到高质量的学术资源。本文将介绍一些有效的方法和策略,帮助您准确查找论文数据库。 1. 选择合适的数据库 不同的…...

翻译《The Old New Thing》- What a drag: Dragging a virtual file (IStream edition)
What a drag: Dragging a virtual file (IStream edition) - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080319-00/?p23073 Raymond Chen 2008年03月19日 拖拽虚拟文件(IStream 版本) 上一次,我们看…...

【FPGA】Verilog语言从零到精通
接触fpga一段时间,也能写点跑点吧……试试系统地康康呢~这个需要耐心但是回报巨大的工作。正原子&&小梅哥 15_语法篇:Verilog高级知识点_哔哩哔哩_bilibili 1Verilog基础 Verilog程序框架:模块的结构 类比:c语言的基础…...

unity打包的WebGL部署到IIS问题
部署之后会出错,我遇到的有以下几种; 进度条卡住不动 明明已经部署到了IIS上,为什么浏览网页的时候还是过不去或者直接报错。 进度条卡住不动的问题其实就是wasm和data的错误。 此时在浏览器上按F12进入开发者模式查看错误(下图…...
GPT-4o:人工智能的新里程碑
GPT-4o,作为OpenAI最新推出的人工智能技术,无疑在人工智能领域掀起了新一轮的浪潮。这款新型的语言模型不仅继承了GPT系列的核心优势,更在多个方面实现了突破性的进展。以下,我们将从版本间的对比分析、GPT-4o的技术能力以及个人整…...

发现一个ai工具网站
网址 https://17yongai.com/ 大概看了下,这个网站收集的数据还挺有用的,有很多实用的ai教程。 懂ai工具的可以在这上面找找灵感。...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...