python入门----面向对象、文件、异常

本文详细介绍了Python中的面向对象编程概念,包括类的定义、构造函数、继承机制、文件操作(如路径、读写、异常处理)、以及测试工具unittest的使用。此外,还涵盖了匿名函数和高阶函数的概念及其应用场景和局限性。
摘要由CSDN通过智能技术生成

面向对象思想

类的定义

在这里插入图片描述
class 空格 类名 冒号

类名的定义

在这里插入图片描述
类名常使用大驼峰命名法

类的构造函数的定义

在这里插入图片描述
def init(self, 参数):
self.属性=参数
构造函数的定义,有几个特殊的地方,首先,他的名字就叫_init_, 其次他有一个默认参数是self,效果就是c++中的this指针,下面属性的赋值都要用到this指针
注意 init前后一共四个下划线

而创建类的对象时,使用类名+括号,里面传入构造函数的参数

类的属性

py中类的属性无需单独进行定义,在构造函数里对谁进行了构造,谁就是类的属性

类的方法定义

在这里插入图片描述
仍然是def 方法名 (self,其他参数)
其中第一个方法,输出时可以对字符串进行乘法运算
第二个方法,使用了f-格式化字符串

继承

语法

在这里插入图片描述
在类名后面加上括号,里面填入父类的类名,就是继承了父类
这样的话 子类就继承了父类的所有的方法和属性
而对于方法和构造方法调用的逻辑是,优先看自己是否有对应的方法,如果没有,再去父类中寻找

关于构造函数问题

当我们继承了父类的构造函数,从而子类可以通过父类的构造函数进行一些属性的构造时,如果子类有自己独特的属性需要构造,那么就会想到在子类中单独对那个独特的属性进行构造,但是这样一来,子类的构造函数被调用了,就不会再去调用父类的构造函数了(如下附图)在这里插入图片描述
所以,我们要用下面的方式来解决
在这里插入图片描述
即在子类的构造方法中,通过super()返回父类对象之后,先调用父类的构造函数,对相关属性进行构造,之后再进行自己独特的属性的构造

文件操作

绝对路径

在这里插入图片描述
在这里插入图片描述

相对路径

在这里插入图片描述
在这里插入图片描述

pycharm获取绝对路径和相对路径

在这里插入图片描述
可以获得文件的绝对路径和以最顶层项目文件夹为参考的相对路径

文件读写

读文件
open()

在这里插入图片描述
1、打开文件
open(路径,模式)
“r”:只读
“w”:只写
2、编码格式,如下图的encoding=“utf-8”
在这里插入图片描述

read()

在这里插入图片描述
使用open打开之后,会返回一个文件对象,该对象有一个read方法,会将文件的内容读到代码中
注意,这里有个细节,就是如果连续两次读取文件的话,第二次会读到空字符,因为程序会记录读到了哪个位置,第一次已经读到了程序的末尾,所以第二次再读就会是空
在这里插入图片描述
当然可以规定一次读多少字节,这样的话,第二次也会读到内容

readline()

在这里插入图片描述
f对象还有个readline方法,一次读取一行,他会根据换行符来判断是否进入了下一行,同时,他会读到换行符,并给到程序,所以输出的话,会每行之间多一行,那是读取到的换行符,加之printf会自动换行,二者共同作用导致的

在这里插入图片描述
小tips,如果读到了最后一行的下一行,那么readline()会返回空字符串,即“”,所以可以根据这个来进行循环读取

readlines()

在这里插入图片描述
他会读取全部内容,并且把每行的内容(包括换行符)当成列表的一个元素进行返回,如上图
在这里插入图片描述
所以,readlines会配合for循环进行使用,这样每次都输出一个元素,会输出一行的内容加一个换行,同时加之print自动换行,就形成上面那种跟readline一样的效果

关闭文件

在这里插入图片描述
两种方式,
关于第二种,with + open(…) as 文件操作对象命名+冒号,且接下来的文件操作都要进行缩进

写文件
open()

在这里插入图片描述
写文件时,要将“r”改为“w”

要注意的是,写文件与读文件有一点不同,就是如果在r模式下,文件路径不存在,那么会报错,但是在w模式下,哪怕根据路径找不到文件,那么也不会报错,而是自动创建文件。
第二点需要注意的是,如果输入的路径文件存在,那么使用w模式打开的话,会将文件的内容清空后进行写的操作,所以需要三思而后行
在这里插入图片描述
接下来我们还是可以传入encoding选择编码格式

write()

在这里插入图片描述
该函数是对文件执行写的操作,但是要注意,如上图所示,write函数不会执行默认换行
在这里插入图片描述
如果想要换行的效果,那么需要手动加上换行符

追加内容

在这里插入图片描述
如果不想情况文件的内容,而是想接着文件的内容继续写,那么就要将“w”换成“a”,表示追加模式,并且会在内容的最后一行进行追加,而不是另起一行,同样,如果文件名不存在,会创建一个新的文件

读+写模式

在这里插入图片描述
如果既想读到文件,又想向文件追加写入内容,那么有一个“r+”模式,他所返回的文件操作对象有read方法以及write方法,两个可以同时使用,但是在其他模式则不行,读就是读,写就是写,同时要注意,在当前模式下,write是追加写入内容

异常处理

try、except语句

有时候虽然我们程序给出了输入的提示,比如上面,明显是让用户输入数字,但是如果用户非要输入一句诗之类的,那么程序就会直接报错炸掉,这显然陷入了用户的节奏里,是不安全的,所以我们需要捕捉异常,提前预判可能出现的异常,进行语句提示,并且不会影响后面代码的执行,如下图所示
在这里插入图片描述

捕捉异常时,要except所预判的异常的报错的单词,之后冒号回车,输入出现这类异常时要执行的操作
如果不知道会出现具体哪种异常,那么直接一个except即可,

值得注意的是:
在这里插入图片描述
他的except也是从上往下执行,只能执行一个,所以一般将具体的预判的异常放在前面,而单纯一个except可以用来兜底

else、finally语句

在这里插入图片描述
else表示,在try语句没有错误时,要运行的语句
finally,则是不管有无错误,不管程序炸了还是没炸,都会执行的语句,总而言之,他是必定会执行的语句

测试

assert

在这里插入图片描述

我们可以在程序中加入assert+返回值为bool类型的表达式,如果表达式结果为True,那么无事发生,如果结果为False,那么会报出AssertingError的错误,表示这里不符合预期,结果为假
这可以帮我们debug,但是他的缺点是,如果这里发现了错误,那么接下来的代码都不会执行,那么就无法知道接下来的代码有无错误,所以我们可以依赖于第三方测试库,他可以一次跑多个用例,并告知我们哪个用例出现了问题

unittest库

介绍

在这里插入图片描述
这个库是用来测试的,他是python自带的,无需安装,直接进行import即可

使用

在这里插入图片描述
一般测试代码会再新建一个源文件,如果测试的源文件与源代码在同一个文件夹内,那么测试代码在引入unittest库的同时,要将测试的函数引入进来,语法是:form 源文件名 import 函数名,或者类名(如果想测试类的方法的话)

在这里插入图片描述
接下来我们正式开始写测试文件,首先定义一个类,可以叫Test函数名,之后继承unittest.TestCase这个类
这样我们就可以使用这个类的方法了
然后每个测试用例就是一个方法,如上图,def了两个方法,也就是两个测试用例,要注意,这里的方法名必须是以test_开头,参数默认带self,之后,写测试用例时,我们要将预期的正确的情况设置为真,基于这个原则,我们调用父类的assertEqual方法,传入{函数名(计算参数),正确的结果},这里表示如果两个参数的结果相等,显示测试通过,否则不通过,且程序不会炸,这里要注意我们在调用父类方法时,使用self调用即可,因为本类继承着父类

运行unittest

在这里插入图片描述
在终端输入python -m unittest ,就会运行所有的测试用例,如果输出两个点,那么表示两个测试用例通过
在这里插入图片描述
如果出现了错误,那么出错的那个会显示F,且告诉你出错的文件,以及出错的数据

unittest其他测试方法

在这里插入图片描述

关于类的方法的测试

在这里插入图片描述
当我们测试一个类的方法时,由于不同的测试用例之间是独立的,所以当我们测试时,每一个的方法内都要创建一个对象进行测试,这样的话效率会很低,所以我们有以下解决办法:
在这里插入图片描述
首先写一个setUp方法,参数是self
之后创建一个对象赋值给自己的属性self.sentence,这时,这个对象就成为了这个测试类的属性
而每个test方法执行前,都会先执行一下setUp方法,那么每次测试用例运行前,都会有一个对象属性被创建出来,参与类的方法的测试

匿名函数

高阶函数

介绍

在这里插入图片描述
如果我们想在一个函数里,用其他函数当做参数传入,并且在函数内部调用参数函数,那么直接传入函数的名字即可,注意不要传入括号,这样的外层函数称为高阶函数
上面是高阶函数的调用语句
而关于高阶函数的定义语句,即自己设置一个函数名放入参数列表,这里这个函数名是形参,之后在函数内进行形参之间的配合,只不过此时的形参不仅仅是几个变量,还有函数

实例1

在这里插入图片描述
右边是四个基础函数,如果我们想要计算乘五的函数,并且以一定的格式输出,那么就可以将对应的函数传入大函数即可

实例2

同时我们还可以传入格式化字符串函数,进行不同的输出格式选择
在这里插入图片描述

匿名函数的使用

场景

加入我们的一个高阶函数中,有一个参数函数,但是这个函数就使用一次,并不常用,那么我们还要单独定义出来那个基础函数,然后传入高阶函数参数列表中,感觉有些不必要,所以,匿名函数派上用场
在这里插入图片描述

格式

在这里插入图片描述

实例

在这里插入图片描述
高阶函数里面的定义代码不变,但是使用匿名函数优化掉了我们单独定义基础函数的过程,我们无需再对其进行定义,直接将匿名函数传入到高阶函数参数列表中,就可以不进行基础函数的独立实现,而是直接在参数实现,将函数功能传给了高阶函数的形参

局限性

在这里插入图片描述
他后面只能有一个语句或者表达式,不能多个

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值