10天玩转Python第9天:python 面向对象 全面详解与代码示例

news2024/11/28 10:49:12

今日内容

  • 异常

  • 模块和包

    • 导入模块(导包)
    • if __name__ == "__main__":
  • Unitest 框架的学习

    • 了解, 基本组成

异常

异常传递[了解]

 

 
异常传递是 Python 中已经实现好了,我们不需要操作, 我们知道异常会进行传递.
异常传递: 在函数嵌套调用的过程中, 被调用的函数 ,发生了异常,如果没有捕获,会将这个异常向外层传递. .... 如果传到最外层还没有捕获,才报错

模块和包

 

 
1. Python 源代码文件就是一个模块
2. 模块中定义的变量 函数 类,都可以让别人使用,同样,可以使用别人定义的(好处: 别人定义好的不需要我们再次书写,直接使用即可)
3. 想要使用 别人的模块中的内容工具(变量, 类, 函数), 必须先导入模块 才可以
4. 我们自己写的代码,想要作为模块使用,代码的名字需要满足标识符的规则(由数字,字母下划线组成,不能以数字开头)

导入模块的语法

方式一
 

 
import 模块名
# 使用模块中的内容
模块名.工具名
# 举例
import random
import json
random.randint(a, b)
json.load()
json.dump()

方式二
 

 
from 模块名 import 工具名
# 使用
工具名  # 如果是函数和类需要加括号
# 举例
from random import randint
from json import load, dump
randint(a, b)
load()
dump()

方式三 [了解] 基本不用
 

 
from 模块名 import *  # 将模块中所有的内容都导入
from random import *
from json import *
randint(a, b)
load()
dump()

 

 
# 方式一 重点记忆
# import random
#
# print(random.randint(1, 20))
# 方式二, 重要快捷方式导包
# from random import randint
# from random import randint
#
# print(randint(1, 20))
# 方式三, 问题: 可能存在多个模块中有相同的名字的工具, 会产生冲突
from random import *
print(randint(1, 20))

 

 
对于导入的模块和工具可以使用 as 关键字给其起别名
注意: 如果起别名,原来的名字就不能用了, 只能使用别名

模块的查找顺序

 

 
在导入模块的时候 会先在当前目录中找模块, 如果找到,就直接使用
如果没有找到回去系统的目录中进行查找, 找到,直接使用
没有找到, 报错
注意点:
定义代码文件的时候, 你的代码名字不能和你要导入的模块名字相同

__name__ 的作用

 

 
1. 每个代码文件都是一个模块
2. 在导入模块的时候, 会执行模块中的代码(三种方法都会)
3. __name__ 变量
3.1 __name__ 变量 是 python 解释器自动维护的变量
3.2 __name__ 变量,如果代码是直接运行, 值是 "__main__"
3.3 __name__ 变量, 如果代码是被导入执行, 值是 模块名(即代码文件名)
在代码文件中, 在被导入时不想被执行的代码,可以写在 if __name__ == "__main__": 代码的缩进中

代码练习

 

 
1. 定义一个模块 tools.py 
2. 在模块中定义一个函数, func, 输出 '我是 tools 模块中的 funn 函数'
3. 在模块中定义一个类, Dog, 具有属性 name, age, 方法 play, 输出 'xx 在快乐的玩耍'
4. 新建一个代码文件, 调用 tools 模块中的 func 函数 并创建一个 Dog 类的对象, 调用 play 方法

包(package)

 

 
在 Python 中, 包 是一个目录, 只不过在这个目录存在一个文件 __init__.py(可以是空的)
将功能相近或者相似的代码放在一起的.
--------
在 Python 中使用的时候,不需要可以是区分是包还是模块, 使用方式是一样的
random 模块 (单个代码文件)
json  包(目录)
unittest 包(目录)
1. import 包名
2. alt  回车 快捷导入

UnitTest框架

介绍

  • 框架

     

     
    说明:
    1. 框架英文单词framework 2. 为解决一类事情的功能集合
    > 需要按照框架的规定(套路) 去书写代码
  • 什么是UnitTest框架?

     

     
    概念:UnitTest是Python自带的一个单元测试框架,用它来做单元测试。
    ----
    自带的框架(官方): 不需要单外安装, 只要安装了 Python,就可以使用
    random, json, os, time
    第三方框架: 想要使用 需要先安装后使用(pytest)
    selenium , appium, requests 
    ----
    单元测试框架: 主要用来做单元测试, 一般单元测试是开发做的.
    对于测试来说, unittest 框架的作用是 自动化脚本(用例代码) 执行框架(使用 unittest 框架 来 管理 运行 多个测试用例的)
  • 为什么使用UnitTest框架?

     

     
    1. 能够组织多个用例去执行 
    2. 提供丰富的断言方法(让程序代码代替人工自动的判断预期结果和实际结果是否相符)
    3. 能够生成测试报告
  • UnitTest核心要素(unitest 的组成部分)

    1. TestCase(最核心的模块)

       

       
      TestCase(测试用例), 注意这个测试用例是 unittest 框架的组成部分, 不是手工和自动化中我们所说的用例(Test Case)
      主要作用: 每个 TestCase(测试用例) 都是一个代码文件,  在这个代码文件中  来书写 真正的用例代码
    2. TestSuite

       

       
      TestSuite(测试套件), 用来 管理 组装(打包)多个 TestCase(测试用例) 的
    3. TestRunner

       

       
      TestRunner(测试执行,测试运行),  用来 执行 TestSuite(测试套件)的
    4. TestLoader

       

       
      TestLoader(测试加载), 功能是对 TestSuite(测试套件) 功能的补充,
      管理 组装(打包)多个 TestCase(测试用例) 的
    5. Fixture

       

       
      Fixture(测试夹具), 书写在 TestCase(测试用例) 代码中, 是一个代码结构, 可以在每个方法执行前后都会执行的内容
      举例: 
      登录的测试用例, 每个用例中重复的代码就可以写在 Fixture 代码结构中, 只写一遍, 但每次用例方法的执行,都会执行 Fixture 中的代码
      1. 打开浏览器
      2. 输入网址

TestCase(测试用例)

 

 
1. 是一个代码文件, 在代码文件中 来书写真正的用例代码
2. 代码文件的名字必须按照标识符的规则来书写(可以将代码的作用在文件的开头使用注释说明)
  • 步骤

     

     
    1. 导包 (unittest)
    2. 自定义测试类
    3. 在测试类中书写测试方法
    4. 执行用例
  • 代码

     

     
    """
    代码的目的: 学习 TestCase(测试用例)模块的书写方法
    """
    # 1, 导包
    import unittest
    # 2, 自定义测试类, 需要继承 unittest 模块中的 TestCase 类即可
    class TestDemo(unittest.TestCase):
        # 3, 书写测试方法, 即 用例代码. 目前没有真正的用例代码, 使用 print 代替
        # 书写要求, 测试方法 必须以 test_ 开头(本质是以 test 开头)
        def test_method1(self):
            print('测试方法 1')
        def test_method2(self):
            print('测试方法 2')
    # 4, 执行用例(方法)
    # 4.1 将光标放在 类名的后边 运行, 会执行类中的所有的测试方法
    # 4.2 将光标放在 方法名的后边 运行, 只执行当前的方法
    问题一 代码文件的命名不规范
     

     
    1. 代码文件的名字以数字开头 
    2. 代码文件名字中有空格
    3. 代码文件名字有中文
    4. 其他的特殊符号
    (数字, 字母, 下划线组成, 不能以数字开头)

问题 2 代码运行没有结果
 

 
右键运行没有 unittests for 的提示, 出现的问题
解决方案:
方案1. 重新新建一个代码文件, 将写好的代码复制进去
方案2. 删除已有的运行方式

问题 3 没有找到用例
 

 
测试方法中不是以 test_ 开头的, 或者单词写错了

TestSuite & TestRunner

 

 
TestSuite(测试套件): 管理 打包 组装 TestCase(测试用例) 文件的
TestRunner(测试执行): 执行 TestSuite(套件)
  • 步骤

     

     
    1. 导包(unittest)
    2. 实例化(创建对象)套件对象
    3. 使用套件对象添加用例方法
    4. 实例化运行对象
    5. 使用运行对象去执行套件对象
  • 代码

     

     
    TestSuite(测试套件): 是用来管理多个 TestCase(测试用例) 的,
    先创建多个 TestCase(测试用例) 文件
     

     
    """
    学习 TestSuite 和 TestRunner 的使用
    """
    # 1. 导包(unittest)
    import unittest
    from hm_07_testcase1 import TestDemo1
    from hm_07_testcase2 import TestDemo2
    # 2. 实例化(创建对象)套件对象,
    suite = unittest.TestSuite()
    # 3. 使用套件对象添加用例方法
    # 方式一, 套件对象.addTest(测试类名('方法名'))   # 建议测试类名和方法名直接去复制,不要手写
    suite.addTest(TestDemo1('test_method1'))
    suite.addTest(TestDemo1('test_method2'))
    suite.addTest(TestDemo2('test_method1'))
    suite.addTest(TestDemo2('test_method2'))
    # 4. 实例化运行对象
    runner = unittest.TextTestRunner()
    # 5. 使用运行对象去执行套件对象
    # 运行对象.run(套件对象)
    runner.run(suite)
     

     
    """
    学习 TestSuite 和 TestRunner 的使用
    """
    # 1. 导包(unittest)
    import unittest
    # 2. 实例化(创建对象)套件对象,
    from hm_07_testcase1 import TestDemo1
    from hm_07_testcase2 import TestDemo2
    suite = unittest.TestSuite()
    # 3. 使用套件对象添加用例方法
    # 方式二 将一个测试类中的所有方法进行添加
    # 套件对象.addTest(unittest.makeSuite(测试类名))
    # 缺点: makeSuite()  不会提示
    suite.addTest(unittest.makeSuite(TestDemo1))
    suite.addTest(unittest.makeSuite(TestDemo2))
    # 4. 实例化运行对象
    runner = unittest.TextTestRunner()
    # 5. 使用运行对象去执行套件对象
    # 运行对象.run(套件对象)
    runner.run(suite)

练习

 

 
1. 在 tools 模块中定义 add 函数, 对两个数字进行求和计算
2. 书写 TestCase 代码对 add() 进行测试 
用例 1:  1, 2, 3
用例 2:  10, 20, 30
用例 3:  2, 3, 5
  • 用例代码
 

 
"""案例练习"""
# 1,导包
import unittest
from tools import add
# 2, 自定义测试类
class TestAdd(unittest.TestCase):
    # 3. 书写测试方法, 就是测试用例代码
    def test_method1(self):
        # 1, 2, 3 判断实际结果和预期结果是否相符
        if add(1, 2) == 3:
            print('测试通过')
        else:
            print('测试不通过')
    def test_method2(self):
        if add(10, 20) == 30:
            print('测试通过')
        else:
            print('测试不通过')
    def test_method3(self):
        # 1, 2, 3 判断实际结果和预期结果是否相符
        if add(2, 3) == 5:
            print('测试通过')
        else:
            print('测试不通过')
  • 套件和执行的代码
 

 
import unittest
# 实例化套件对象
from hm_08_test import TestAdd
suite = unittest.TestSuite()
# 添加测试方法
suite.addTest(unittest.makeSuite(TestAdd))
# 实例化执行对象
runner = unittest.TextTestRunner()
runner.run(suite)

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

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

相关文章

获取MODIS的NDVI/EVI产品

目录 简介源代码运行流程参考博文 简介 本项目是使用MODIS的NDVI产品(MOD13Q1),可获取从2000年至今的所有数据,更新频率为16天 MOD13Q1 V6.1产品以每像素为基础提供植被指数(VI)值。这里有两个主要的植被层。第一种是归一化植被指数(NDVI)&a…

LeedCode刷题---滑动窗口问题(二)

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、将X减到0的最小操作数 题目链接:将 x 减到 0 的最小操作数 题目描述 给你一个整数数组 nums 和一个整数 x 。每一…

MetaAI语音翻译大模型Seamless登场,主打AI无缝同声传译

论文题目: Seamless: Multilingual Expressive and Streaming Speech Translation 论文链接: https://ai.meta.com/research/publications/seamless-multilingual-expressive-and-streaming-speech-translation/ 代码链接: GitHub - facebook…

2024年转行软件测试,报培训班3个月出来就是高薪工作,真的靠谱吗?

作为一个已在IT行业工作8年,分享一下我的经验,供大家参考。 讲真,现在想通过培训班培训几个月就进入IT行业,越来越来难了;如果是在2018年以前,还有机会,一方面,那个时候IT行业还不算…

Linux系统log日志简单清理

系统空间告急 清理log日志 找出当前目录中文件最大的10个文件: cd /var/log du -s ./* | sort -nr | head 系统日志log文件: ll -h /var/log/journal 只保留100MB的日志 journalctl --vacuum-size100M 系统暴力爆破SSH日志: ll -h /var/lo…

Flask基本用法:一个HelloWorld,搭建服务、发起请求

目录 1、简介 2、安装 3、Flask使用示例 参考 1、简介 官网文档 Flask是一个轻量的web服务框架,我们可以利用它快速搭建一个服务,对外提供接口,其他人可以轻松调用我们的服务。这对算法工程师来说比较关键,我们通常不擅长搞开发…

【精选】计算机网络教程(第2章网络层)

目录 前言 第2章网络层 1、编码与调制 2、传输方式 前言 总结计算机网络教程课程期末必记知识点。 第2章网络层 1、编码与调制 信道可以分成传送模拟信号的模拟信道和传送数字信号的数字信道两大类。通常人们将数字数据转换成数字信号的过程称为编码,而将数字…

leetcode刷题日志-383赎金信

思路:分别用两个map记录ransomNote和magazine中的字符以及出现的次数。最后遍历记录ransomNote的map,如果ransomNote的map中出现的magazine的map中没有出现或者出现的次数小于ransomNote的map则返回false,否则返回true; class So…

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Pycharm 环境Android环境 相关其它博客工程源代码下载其它资料下载 前言 本项目采用VGG-16网络模型,使用Kaggle开源数据集,旨在提取图片中的用户特征,最终在移…

我们来谈谈葡萄酒泡泡吧

香槟是任何庆祝场合的最佳搭配。从婚礼和生日到单身派对和典型的周五晚上,这款气泡饮料是生活中特别聚会的受欢迎伴侣。 来自云仓酒庄品牌雷盛红酒分享你知道吗,你喜欢喝的那瓶香槟酒可能根本不是香槟,而是汽酒?你不是唯一一个认为…

UE虚幻引擎项目更改名字怎么操作?

首先找到项目目录,直接更改项目程序的名字,其次点击项目程序右击使用文本打开,然后将Modules模块中的内容删除即可,然后运行程序就好啦!

如何将数据库导入MySQL的办法

在电脑cmd终端进行导入 首先找到MySQL中bin的位置 第一步:找到MySQL 第二步:进入MySQL 第三步:打开bin 第四步:输入cmd进入终端 第五步: 输入mysql -uroot -p 然后会弹出enter password: 输入你的密码…

libevent服务GET/POST的简单使用

目录 1、前言2、测试demo2.1、目录结构2.2、 测试源码2.2.1、http_server.cpp2.2.2、 http_server.h 2.3、 编译2.4、 运行结果2.4.1、测试POST2.4.2 、测试GET请求 1、前言 项目开发中经常需要使用到私有协议和Qt,Android等GUI前端通信,比较常用的使用POST和GET方式…

CesiumLab地理信息基础数据处理平台 各类数据类型介绍、发布数据介绍

目录 0 引言1 CesiumLab2 数据处理模块2.1 输出格式:切片文件格式2.2 输入格式2.2.1 传统GIS数据2.2.2 人工模型2.2.3 BIM模型2.2.4 倾斜实景数据2.2.5 点云数据 3 发布服务功能3.1 拓展:其他平台发布服务功能 🙋‍♂️ 作者:海码…

http状态码(一)400报错

一 400报错汇总 ① 综述 一、4xx状态码报错说明: 客户端行为导致的报错二、通用的4xxHTTP报错1) 4002) 4013) 4034) 4045) 405 --> 不允许方法,可能跨域或者nginx限制请求方法6) 4087) 4138) 419三、ngin自身定义的4xx报错495、496、497、498、4…

【JAVA-Day65】Java内部类深度解析

Java内部类深度解析 《Java内部类深度解析》摘要引言一、理解内部类1. 内部类的基本概念和语法1.1 什么是内部类?1.2 内部类的语法结构1.3 内部类的基本概念 2. 不同类型的内部类详解2.1 成员内部类2.2 静态内部类2.3 局部内部类2.4 匿名内部类 二、内部类与普通类的…

K - 近邻算法

1、算法介绍 KNN(K Near Neighbor):k个最近的邻居,即每个样本都可以用它最接近的k个邻居来代表。KNN算法属于监督学习方式的分类算法,我的理解就是计算某给点到每个点的距离作为相似度的反馈。 简单来讲,KN…

算法-----全排列

目录 前言 代码 思路 我的其他博客 前言 全排列是一种组合数学的概念,它表示将一组元素按照一定顺序进行排列的所有可能情况。在计算机编程中,通常使用递归来实现全排列。以下是使用Java语言实现全排列的详细解释: 代码 public class Pe…

YOLOv8改进:ASF-YOLO助力小目标,提取多尺度特征| 2023年12月最新成果

🚀🚀🚀本文改进: ASF-YOLO一种新的特征融合网络架构,该网络由两个主要的组件网络组成,可以为小目标分割提供互补的信息:(1)SSFF模块,它结合了来自多尺度图像的全局或高级语义信息;(2)TFE模块,它可以捕获小目标的局部精细细节等 🚀🚀🚀YOLOv8改进专栏:http://…

邮件服务下载安装详细步骤、汉化、配置

Foxmail for Mac 下载地址:Download - hMailServer - Free open source email server for Microsoft Windows 教程地址 hMailServer安装使用教程 - 诸子流 - 博客园 (cnblogs.com) 设置密码为:dzqdb123 设置好端口 添加账号密码 (9条消息) hMailServer 配置DKIM…