Python—面向对象小解(3)

news2024/11/19 8:49:50

一、多态

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

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

运算符 + * 的多态

int + int 加法计算

str + str 字符串拼接

list + list 列表的数据合并

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

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

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

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

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

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

# 多态
class Teacher:

    def __init__(self,name):
        self.name = name

    def run(self):
        print(f'{self.name}老师开车')

    def stop(self):
        print(f'{self.name}老师停车')

class Car:

    def __init__(self,type):
        self.type = type

    def 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 = name

    def 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 = type

    def 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 = name

    def run(self):
        pass

    def stop(self):
        pass

class Car(Teacher):

    def __init__(self,type,name):
        super().__init__(name)
        self.type = type

    def 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 = type

    def 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 + b
    print(data)

try:
    # 调用其他开发人员编写的代码处理错误
    func('10',20)
except Exception as e:
    print(e)


#封装函数时异常捕获
# 函数的异常处理
def func(a, b):
    data = 0
    # 在封装的函数内捕获异常
    try:
        data = a + b
    except:
        # 函数内自己处理异常
        print('异常错误')
    return data


# 调用函数
func(10,'20')

#函数内捕获到异常不处理,再传递给掉用函数的地方
# 函数的异常处理
def func(a, b):
    data = 0
    # 在封装的函数内捕获异常
    try:
        data = a + b
    except:
        # 将异常的错误信息传递到调用地方 当前没有处理异常
        raise Exception('函数内计算错误')
    return data



# 调用函数时,捕获函数执行的异常
try:
    func(10,'20')
except Exception as e:
    print('异常捕获')
    print(e)



# 多个函数中都要使用的变量可以定义成全局变量,通过global声明,就可在多个函数就可以共享全局数据
name_list = []
password_list = []

# 登录注册功能
def login():
    # 函数作用域
    # 通过四个空格,来确认函数所执行的逻辑从哪里开始
    # 列表,元组,集合,字典数据可以省略global声明
    15/0
    global name_list
    global password_list
    for num in range(3):  # [0,3)  0,1,2
        name = input('请输入用户名:')
        password = input('请输入密码:')
        # 先判断用户名是否正确
        if name in name_list:
            # 在判断密码是否正确
            if password in password_list:
                print('登录成功')
                # 适应break关键,会结束循环,不再进行取值
                break
            else:
                print('密码不正确')
        else:
            print('用户名不正确')

def register():
    global name_list
    global password_list
    name = 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':
        pass
    elif num == '4':
        pass
    else:
       break

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

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

相关文章

字符串 | 字符串匹配之 KMP 算法以及 C++ 代码实现

目录 1 为什么使用 KMP?2 什么是 next 数组?2.1 什么是字符串的前后缀?2.2 如何计算 next 数组? 3 KMP 部分的算法4 完整代码 😈前言:这篇文章比较长,但我感觉自己是讲明白了的 1 为什么…

Vue之组件基础(插槽)

在HTML中,开发者可以在双标签内添加一些信息。而在Vue中,组件以标签的形式引用,那么如何在组件的标签内添加一些信息并将信息渲染到页面中呢?其实,Vue 提供了插槽,专门用来实现这样的效果。 一.什么是插槽 Vue为组件…

怎么使用Python代码在图片里面加文字

在Python中,给图片添加文字可以使用Pillow库(PIL的一个分支),它是一个强大的图像处理库。如果你还没有安装Pillow,可以通过pip安装: pip install Pillow下面使用一个简单的示例,演示如何使用Pi…

系统架构设计师【第9章】: 软件可靠性基础知识 (核心总结)

文章目录 9.1 软件可靠性基本概念9.1.1 软件可靠性定义9.1.2 软件可靠性的定量描述9.1.3 可靠性目标9.1.4 可靠性测试的意义9.1.5 广义的可靠性测试与狭义的可靠性测试 9.2 软件可靠性建模9.2.1 影响软件可靠性的因素9.2.2 软件可靠性的建模方法9.2.3 软件的可靠性模…

CISCN 2023 初赛 被加密的生产流量

题目附件给了 modbus.pcap 存在多个协议 但是这道题多半是 考 modbus 会发现 每次的 Query 末尾的两个字符 存在规律 猜测是base家族 可以尝试提取流量中的数据 其中Word Count字段中的22871 是10进制转16进制在转ascii字符串 先提取 过滤器判断字段 tshark -r modbus.pcap …

java线程状态介绍

1.新建(New): 线程对象已创建,但还没有调用 start() 方法。 2.可运行(Runnable): 线程已启动,处于就绪状态,等待 JVM 的线程调度器分配CPU时间。 3.阻塞(Blocked): 线程…

自动化桌面整理新时代:Llama 3驱动的智能文件管理系统

在信息爆炸的时代,个人和企业用户的电脑桌面常常被海量文件占据,导致查找特定文件如同大海捞针。为了解决这一痛点,Llama 3应运而生——一个集成了先进多模态AI技术的智能文件管家,旨在将杂乱无章的文件世界变得井然有序。本文将深入探讨Llama 3如何利用其创新功能,不仅自…

上传RKP 证书签名请求息上传到 Google 的后端服务器

上传证书签名请求 1.准备环境:OK pip3 install google-auth2.13.0 requests2.28下载 device_info_uploader.py 。 没找到先跳过 选项 1:通过 GCP 帐户使用 device_info_uploader.py 运行脚本。 ./device_info_uploader.py --credentials /secure/s…

简要分析学习spring内存马,劫持马

简要分析学习spring内存马,劫持马 本文主要是通过SpringMemShell这个工程,来对spring内存马进行演示,利用。 写在前面: 参考的是大佬给的流程以及思路,其中的解释与分析非常详细 ----->>大佬的链接 这里的内存马文件取自gi…

python采集汽车价格数据

python采集汽车价格数据 一、项目简介二、完整代码一、项目简介 本次数据采集的目标是车主之家汽车价格数据,采集的流程包括寻找数据接口、发送请求获取响应、解析数据和持久化存储,先来看一下数据情况,完整代码附后: 二、完整代码 #输入请求页面url #返回html文档 imp…

Scikit-Learn 基础教程

目录 🐋Scikit-Learn 基础教程 🐋Scikit-Learn 简介 🐋 数据预处理 🦈数据集导入 🦈数据清洗 🦈特征选择 🦈特征标准化 🐋 模型选择 🦈分类模型 🦈回…

Resilience4j结合微服务出现的异常

Resilience4j结合微服务出现的异常 1、retry未生效 由于支持aop&#xff0c;所以要引入aop的依赖。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>2、circ…

解决:【无法安装“vue.volar“扩展,因为它与当前 VIsual Studio Code 版本不兼容(版本 1.80.0)】

目录 问题复现问题分析解决步骤1、进入VSCode插件市场&#xff0c;搜索Vue.volar2、点击搜索结果&#xff0c;进入详情页面3、下载.vsix文件完成后&#xff0c;用解压软件打开 4、复制package.json文件&#xff0c;修改vscode版本5、保存package.json文件&#xff0c;并更新.v…

2024 HN CTF WebMisc 部分 wp

Web ez_tp 判断是thinkphp 3.2 参考官方手册:https://www.kancloud.cn/manual/thinkphp/1697 判断路由模式 URL_CASE_INSENSITIVE > true, // 默认false 表示URL区分大小写 true则表示不区分大小写URL_MODEL > 1, // URL访问模式,可选参数0、1、…

cURL error 60: SSL certificate problem: unable to get local issuer certifica

本地小程序把接口换到本地的服务器接口&#xff0c;然后就报错了&#xff1a; cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) 经查询查到&#xff1a;此问题的出现是由于没有配…

第八十九周周报

学习目标&#xff1a; 论文 学习时间&#xff1a; 2024.05.25-2024.05.31 学习产出&#xff1a; 一、论文 SAN: INDUCING METRIZABILITY OF GAN WITH DISCRIMINATIVE NORMALIZED LINEAR LAYER 将GAN与切片最优输运联系起来&#xff0c;提出满足方向最优性、可分离性和单射…

数据资产价值如何评估?一文详解如何构建数据资产评估的综合框架

数据资产&#xff0c;如同其构成的数据本身&#xff0c;具备物理、存在和信息三重属性。数据资产的物理属性体现在其对存储空间的占用&#xff1b;其存在属性则体现在数据的可读取性上&#xff0c;若数据无法读取&#xff0c;则其作为资产的价值便无从体现。这两个属性共同构成…

LeetCode 算法: 字母异位词分组c++

原题链接&#x1f517;&#xff1a;字母异位词分组 难度&#xff1a;中等⭐️⭐️ 题目 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“e…

centos7.9离线安装mysql5.7

centos7.9离线安装mysql5.7 查询mysql查询组查询用户不存在创建即可&#xff0c;创建mysql用户组上传下载的安装包创建my.cnf文件修改配置文件修改mysql登陆密码 centos7.9 mysql5.7 查询mysql rpm -qa | grep mysql我这里查询是不存在&#xff0c;如果你的存在可以用rm -rf […

云原生架构相关技术_4.服务网格

1.技术特点 服务网格&#xff08;ServiceMesh&#xff09;是分布式应用在微服务软件架构之上发展起来的新技术&#xff0c;旨在将那些微服务间的连接、安全、流量控制和可观测等通用功能下沉为平台基础设施&#xff0c;实现应用与平台基础设施的解耦。这个解耦意味着开发者无需…