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

今日内容

  • 异常

  • 模块和包

    • 导入模块(导包)
    • 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.mzph.cn/news/229353.shtml

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

相关文章

Grafana Loki 快速尝鲜

Grafana Loki 是一个支持水平扩展、高可用的聚合日志系统,跟其他的聚合日志系统不同,Loki只对日志的元数据-标签进行索引,日志数据会被压缩并存储在对象存储中,甚至可以存储在本地文件系统中,能够有效降低成本&#xf…

下午好~ 我的论文【遥感】(第一期)

写在前面:下午浑浑噩噩,泡杯茶,读篇论文吧 首先说明,时间有限没有那么精力一一回复了,对不起各位了TAT 文章目录 遥感Bi-Dilation-formerCNN-GNN-FusionMulti-hierarchical cross transformerCoupled CNNs 遥感 Bi-D…

电路中的屏蔽罩作用及设计

1.1 屏蔽罩作用 1.1.1 屏蔽电子信号,防止外界的干扰或内部向外的辐射: 一般见于通信类电路PCB,主要一个无线通信产品上有的敏感器件、模拟、数字电路、DCDC电源电路,都需屏蔽隔离,是为了不影响其它电路,也有防止其它电…

国际刑警组织推出新的生物识别系统

2023 年 11 月 29 日,国际刑警组织发布了一份有关创建生物识别工具的新闻稿,至少在意大利,该工具似乎已经陷入沉默,但让我们看看为什么我们会对这个东西感兴趣。 国际刑警组织的新闻稿用了整整一段时间来讨论与隐私相关的问题&am…

0x31 质数

0x31 质数 定义: 若一个正整数无法被除了1和它自身之外的任何自然数整除,则称该数为质数(或素数),否则则称该正整数为合数。 在整个自然数集合中,质数的数量不多,分布比较稀疏,对…

动态规划——OJ题(一)

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、第N个泰波那契数1、题目讲解2、思路讲解3、代码实现 二、三步问题1、题目讲解2、思路讲解…

拖拽属性 draggable

H5 新增的属性 draggable,它能够给与一切的 html 元素拖动的效果。 拖拽元素 属性为 draggable"true" 的元素,可拖动,且拖动时鼠标变为禁用图标 ps: 直接写 draggable 可能无效 ondragstart 开始拖拽时触发(按下鼠标…

ARM架构简析

全局与局量等知识 断电后,程序以及数据都在FLASH中。 断电后,内存中就没有变量了。 程序在烧在FLASH中的; 程序运行的时候,全局变量的初始值,必然是从FLAASH中的来的: 初始化全局变量的过程:…

pytorch和pytorchvision安装

参考https://blog.csdn.net/2301_76863102/article/details/129369549 https://blog.csdn.net/weixin_43798572/article/details/123122477 查看我的版本 右键,nvivdia控制面板,帮助,系统信息 驱动程序版本号为528.49 更新很快的 CUDA版本…

cpp:1:10: fatal error: opencv2/core.hpp: 没有那个文件或目录

前言&#xff1a; 我按照官网方法安装了opencv&#xff0c;运行的也是官网的测试代码&#xff1a; #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> using namespace cv; int main() {printf("hello world")return 0; } 半解决&#xff…

k8s - container

1、容器的生命周期&#xff1a; (1) 简介&#xff1a; Kubernetes 会跟踪 Pod 中每个容器的状态&#xff0c;就像它跟踪 Pod 总体上的阶段一样。 可以使用容器生命周期回调&#xff0c;在容器生命周期中的特定状态点触发事件。 ● 容器生命周期回调&#xff1a; 在容器的生…

数据结构之<图>的介绍

图&#xff08;Graph&#xff09;的概念&#xff1a; 在数据结构中&#xff0c;图是由节点&#xff08;顶点&#xff09;和边组成的非线性数据结构。图用于表示不同对象之间的关系&#xff0c;其中节点表示对象&#xff0c;边表示对象之间的连接或关系。 1.图的基本组成元素&a…

人生感悟 | 当前经济形势,给25~35岁的年轻人一点建议

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 这两年经济情况怎么样呢&#xff1f;相信大家都有自己的感觉。 且不说网上看到的“裁员裁到大动脉”“设计院欠薪”等各种新闻。 说自己和家人的亲身经历吧&#xff0c;这两年经历了被拖欠工资、公司缩编、换工作、公…

Vue中插槽的使用

目录 一、默认插槽 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;代码展示 &#xff08;3&#xff09;后备内容 二、具名插槽 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;代码展示 三、作用域插槽 &#xff08;1&#xff09;概念 &#xff0…

一个 tomcat 下如何部署多个项目?附详细步骤

一个tomcat下如何部署多个项目&#xff1f;Linux跟windows系统下的步骤都差不多&#xff0c;以下linux系统下部署为例。windows系统下部署同理。 1 不修改端口&#xff0c;部署多个项目 清楚tomcat目录结构的应该都知道&#xff0c;项目包是放在webapps目录下的&#xff0c;那…

vue2 echarts不同角色多个类型数据的柱状图

前端代码&#xff1a; 先按照echarts插件。在页面里引用 import * as echarts from "echarts";设置div <div style"width:100%;height:250px;margin-top: 4px;" id"addressChart"></div>方法: addressEcharts() {const option {g…

RabbitMQ搭建集群环境、配置镜像集群、负载均衡

RabbitMQ集群搭建 Linux安装RabbitMQ下载安装基本操作命令开启管理界面及配置 RabbitMQ集群搭建确定rabbitmq安装目录启动第一个节点启动第二个节点停止命令创建集群查看集群集群管理 RabbitMQ镜像集群配置启用HA策略创建一个镜像队列测试镜像队列 负载均衡-HAProxy安装HAProxy…

【精选】计算机网络教程(第3章数据链路层)

目录 前言 第3章数据链路层 1、差错检测&#xff08;CRC&#xff09; 2、点对点协议&#xff08;了解应用场景&#xff09; 3、什么是碰撞域&#xff0c;什么是广播域 碰撞域&#xff08;Collision Domain&#xff09;&#xff1a; 广播域&#xff08;Broadcast Domain&a…

计算机组成原理学习(输入输出系统)

目录 输入输出系统&#xff08;i/o系统&#xff09; 一.现代计算机的结构 二.常见的&#xff08;I/O设备或者是外部设备&#xff09; ​ 三.主机如何与I/O设备进行交互 四.I/O控制方式简介 五.I/O系统的基本组成 输入输出系统&#xff08;i/o系统&#xff09; 一.现代计算…

一键安装下载3ds Max!别墅还是宫殿?3ds Max助你建造梦幻般的艺术建筑

不再浪费时间在网上寻找3ds Max的安装包了&#xff01;因为你所需要的一切都可以在这里找到&#xff01;作为一款全球领先的3D设计工具&#xff0c;3ds Max为创作者们带来了前所未有的便利和创作灵感。无论是建筑设计、影视特效还是游戏开发&#xff0c;3ds Max都能帮助你实现想…