Python高阶

  • python高阶
    • 面向对象
      • 基本概念
        • 类(class):描述具有相同属性和行为的对象的集合。比如学生类(学号、姓名、班级、学习)
        • 对象(object):通过类定义的数据结构的实例,是对类的具体实现
        • 属性:描述类的静态特征
          • 类属性:每一个对象都具有并且值相同,比如学生的国籍
          • 实例属性:每一个对象都具有,但是值可能不同,比如学生姓名、年龄等
        • 方法:描述类的动态行为
          • 类方法:通过装饰器@classmethod声明,常通过类调用,一般用于修改类属性的值
          • 实例方法:类中最常用的方法,常通过对象调用
          • 静态方法(了解):通过装饰器@staticmethod声明,常通过类调用,通过是一些和类本身无关的方法
      • 类的声明
        • 语法:

          Python高阶_第1张图片

          • 类名:符合标识符命名规范,通常每个单词首字母大写
        • 例1:声明一个学生类
          • 属性:学号、姓名、年龄、国籍、班级
          • 方法:学习

            Python高阶_第2张图片

      • 对象的声明(实例化)
        • 语法:对象名 = 类名([实参1,实参2,......])
        • 例1:实例化Student类

          Python高阶_第3张图片

      • 例1:
        • 声明一个学校类,学校类中声明一个类属性表示学校的总人数,声明一个类方法用于更新学校总人数
        • 声明一个学生类,包含学生的基本信息,每实例化一个学生,则学校的总人数+1

          Python高阶_第4张图片

      • 内置方法
        • __new__(),new方法,在实例化时自动调用,用于创建对象
        • __init__(),构造方法,初始化对象,在实例化时自动调用
        • __del__(),析构方法,销毁对象,在对象生命周期结束时自动调用,删除对象
        • 例:Python高阶_第5张图片
      • 例2:
        • 声明一个学校类,学校类中声明一个类属性表示学校的总人数,声明一个类方法用于更新学校总人数
        • 声明一个学生类,包含学生的基本信息,每实例化一个学生,则学校的总人数+1

          Python高阶_第6张图片

      • 例3:
        • 声明一个学校类,学校类中声明4个类属性分别表示学校的总人数、高一、高二、高三年级的人数,声明一个类方法用于更新学校总人数以及对应年级的人数
        • 声明一个学生类,包含学生的基本信息(姓名、年龄、班级-高三二班),每实例化一个学生,则学校的总人数+1

          Python高阶_第7张图片

      • 例4:
        • 声明一个资金类,有3个类属性,分别保存销售总额,食品类销售额、服饰类销售额;声明一个类方法用于更新销售总额、以及不同商品类别的销售额
        • 声明一个销售类,包含销售的商品名称、类别、单价、销售数量,销售完成后需要更新销售总额以及对应类别商品的销售额

          Python高阶_第8张图片

      • 例5:城防系统
        • 在城墙(自定义城墙总面积)上安置各类的防御装备,包括(占地面积10),高射机枪(占地面积5),单兵装备(占地面积2),阵地机枪(占地面积7)
        • 程序开始后随机生成一个防御装备,将其安置在城墙上,重复这个过程直到城墙上的可使用面积小于2为止。输出已经安置的各种设备的数量。

          Python高阶_第9张图片

      • 例6:投篮训练,统计在2分钟内的训练成绩
        • 声明球员类,包含球员的基本信息(姓名、历史投篮命中率,训练次数、命中数)、投篮方法
        • 每次投篮后随机调整1-3秒
        • 命中率模拟:比如命中率为90%,可以声明一个列表或者字符串,其中包含10个元素(1/0,1表示命中,0表示未命中),每次投篮随机选择一个作为投篮结果

          Python高阶_第10张图片

      • 对象组合
        • 用于描述类与类之间的关系,多个类之间存在依赖关系,需要在A类中调用B的属性或者方法
        • 方式
          • 1、在A类的实例方法中传入B类的对象,通过该对象调用B类中的属性和方法(A类、B类相互依赖)
          • 2、在A类的构造方法中传入B类的对象,通过该对象调用B类中的属性和方法(A类依赖于B类)
        • 例1:饲养员与动物
          • 有10个房间,每个房间中随即放入老虎或者羊
          • 饲养员不知道每个房间中的动物类型,可以选择敲门(房间中的动物发出叫声,同时体重-5)获知动物类型。饲养员给动物喂食,喂正确则体重+10,错误了则体重-10(老虎吃肉,羊吃草)
          • 游戏时间1分钟,统计每个房间中动物的体重
          • 分析:完成整个事件有哪些对象,这些对象具有哪些属性和方法,将对象的属性和方法抽象为类
            • 老虎
              • 属性:名字、体重
              • 方法:吃东西、发出叫声
              • 属性:名字、体重
              • 方法:吃东西、发出叫声
            • 房间
              • 属性:房间号、动物类型
            • 饲养员
              • 属性:姓名
              • 方法:敲门、喂食
          • 代码实现

            Python高阶_第11张图片

      • 练习1:射击训练
        • 士兵进行射击训练,统计在1分钟内的开枪次数,总成绩(每一次射击的成绩在8-10环之间)。
        • 枪的弹夹容量为10,子弹打完后需要3秒换弹夹
        • 每次射击后需要随机调整1-3秒才能开下一枪
        • 分析有几个对象,每个对象有什么属性和方法(枪、士兵)
      • 练习2:玩家与怪物
        • 系统生成一个怪物(怪物名称、血量、攻击值、防御值、攻击方法)
        • 生成一个玩家(姓名、血量、攻击值、防御值、攻击方法)
        • 系统角色和玩家的属性都由系统随机生成
          • 血量:2000-3500之间
          • 攻击:300--450之间
          • 防御:150-250之间
        • 对战开始后玩家先手攻击,怪物掉血(玩家攻击值-怪物防御值)
        • 怪物攻击,玩家掉血(怪物攻击值-玩家防御值)
        • 任意一方血量为0则对战结束
      • 面向对象的三大特性
        • 封装
          • 私有化:在属性或者方法名前面加2条下划线,此时属性或者方法就变为私有的,只能在当前类的内部访问
          • 可以用来隐藏一些内部实现的细节,同时提供一些对外的接口,来访问内部的数据
          • Python高阶_第12张图片

        • 继承
          • 作用:提高代码重用性,降低代码冗余
          • 基本概念:
            • 子类:继承其他类的类
              • 可以有多个父类
              • 可以继承父类所有非私有的属性和方法
            • 父类:也叫做基类、超类,被别的类来继承的类
            • 重写:子类继承父类的方法,父类的方法在某些地方不是特别适用,在子类中重新实现该方法
            • Python3是广度优先(横向),不是深度有限(纵向)
          • 例1:

            Python高阶_第13张图片

          • 例2:父类控制子类,子类必须重写方法

            Python高阶_第14张图片

          • 例3:单例模式
            • 在程序运行期间保证类的实例只有1个,从而节约资源开销
            • 实现方式有很多种
            • Python高阶_第15张图片

        • 多态
          • 多态性:具有不同功能的函数可以使用相同的函数名,从而可以通过同一个函数名调用不同功能的代码
          • 可扩展性好
          • Python高阶_第16张图片

    • 多线程
      • 线程:进程内部进行CPU调度的基本单位,一个进程中至少存在一个线程
        • python的多线程是在一个时间段内做多件事情,在同一个时间点是不能实现做多线程的
        • 进程和CPU核心数量有直接关系,如四核、八核
      • 模块:threading
        • 脚本本身是主线程,创建的线程是子线程
      • 创建线程:Thread(target=func[args=(value1,value2,......)])
        • target,指定线程需要执行的任务(通常是函数名或者方法名,不要加括号,加括号表示调用)
        • args,指定线程执行的任务需要传入的实参,以元组形式传入
      • 启动线程:start()
      • 线程守护
        • 作用:子线程跟随主线程结束而结束
        • 方法:setDaemon(True),必须在线程启动前设置
      • 线程阻塞
        • 作用:主线程在子线程结束后结束
        • 方法:join(),需要在线程启动后设置
      • 例1:
        • 投篮训练(多线程版)

          Python高阶_第17张图片

      • 例2:
        • 射击训练(多线程版)
      • 线程锁
        • 作用:解决子线程共享全局变量时出现的数据冲突问题,从而确保数据的安全性和准确性
        • 缺点:降低程序运行效率
        • 使用步骤
          • 1、创建锁:lock = Lock()
          • 2、在编辑全局变量之前获取锁,锁定全局变量只能由当前子线程编辑
            • lock.acquire()   获取锁
          • 3、编辑完成后,释放锁(一定记得释放)不然就死锁了
            • lock.release()
          • 4. 使用with lock,使用with管理上下文,获取锁后,再自动释放掉锁,
          • 子线程操作同一个线程时,一定要记得加锁
        • 例:

          Python高阶_第18张图片

    • 正则表达式
      • 作用:实现对字符串的复杂控制
      • 模块:re(系统模块)
      • 方法:
        • split(pattern,string),使用字符串中与pattern规则匹配的内容进行分隔,返回一个列表
          • pattern,正则表达式
          • string,待处理的字符串

            Python高阶_第19张图片

        • sub(pattern,repl,string),将字符串中与pattern规则匹配的内容进行替换(替换成repl),返回一个新字符串
          • pattern,正则表达式
          • string,待处理的字符串
          • repl,新内容

            Python高阶_第20张图片

        • findall(pattern,string[,控制字符]),以列表返回字符串中与pattern规则匹配的内容,如果没有匹配的则返回空列表
          • pattern,正则表达式
          • string,待处理的字符串
          • 控制字符主要包含以下两个
            • re.S,使元字符.可以匹配包括换行符\n在内的所有字符
            • re.I,忽略大小写

              Python高阶_第21张图片

      • 元字符
        • \w,匹配一个单词字符(字母、数字、下划线)
        • \W,匹配一个非单词字符

          Python高阶_第22张图片

        • \d,匹配一个数字字符
        • \D,匹配一个非数字字符

          Python高阶_第23张图片

        • \s,匹配一个空白字符
        • \S,匹配一个非空白字符

          Python高阶_第24张图片

        • .,匹配除换行符\n以外的任意一个字符
        • ^,匹配字符串开头
        • $,匹配字符串结尾

          Python高阶_第25张图片

        • *,匹配前一个字符任意次
          • ab*-- a、ab、abb、abbbbbb
        • +,匹配前一个字符至少1次
          • ab+-- ab、abb、abbbbbb
        • ?,匹配前一个字符0次或者1次
          • ab?-- ab、a
        • {n},匹配前一个字符n次
          • ab{3}-- abbb
        • {n,},匹配前一个字符至少n次
          • ab{3}-- abbb、abbbb
        • {n,m},匹配前一个字符至少n次,最多m次
          • ab{1,3}-- abbb、abb、ab
        • {,m},匹配前一个字符最多m次
          • ab{,3}-- abbb、abb、ab、a

        • [],匹配括号中的任意内容
          • [a-z],匹配小写字母
          • [A-Z],匹配大写字母
          • [0-9,匹配数字
          • [ab][5-7],a5、a6、a7、b5、b6、b7

            Python高阶_第26张图片

        • 左边界(pattern)有边界,分组,根据左右边界返回与表达式匹配的内容
          • .*,贪婪匹配,最大范围匹配左右边界
          • .*?,非贪婪匹配,最小范围匹配左右边界

            Python高阶_第27张图片

    • 网络编程
      • OSI模型

        Python高阶_第28张图片

      • TCP/IP模型
        • 结构

          Python高阶_第29张图片

        • 应用层:HTTP、HTTPS、FTP、SMTP、IMAP、POP3
          • HTTP协议请求方法(最常用):GET、POST
        • 传输层:TCP、UDP
          • UDP,用户数据报协议,提供无连接、不可靠的通信服务(效率高、资源消耗少)
          • TCP,传输控制协议,提供面向连接、可靠的通信服务(安全性、可靠性高)
            • 三次握手
              • 作用:建立连接
              • 过程

                Python高阶_第30张图片

            • 四次挥手
              • 作用:断开连接
              • 过程:

                Python高阶_第31张图片

      • socket编程
        • 套接字,工作在传输层与应用层之间,通过TCP或者UDP协议传输信息,分为客户端和服务端
        • 模块:socket
        • 使用步骤
          • 服务端
            • 1、创建socket对象:soc = socket.socket()
            • 2、绑定IP和端口:soc.bind((ip,port))
            • 3、设置监听:soc.listen()
            • 4、等待客户端连接:soc.accept()
          • 客户端
            • 1、创建socket对象:soc = socket.socket()
            • 2、连接服务器:soc.connect((ip,port))
          • 公共方法:
            • send(),发送消息
            • recv(),接收消息
        • 例:
          • 服务端

            Python高阶_第32张图片

          • 客户端

            Python高阶_第33张图片

      • requests
        • 作用:模拟客户端向服务端发送http或者https请求
        • 模块:requests
          • pip install requests
        • GET请求
          • get(url[,params,headers,file])
            • url,请求地址
            • params,请求的参数,一般使用字典传入
            • headers,请求头
            • file,一般用于上传文件
          • 例1:获取豆瓣电影排行榜
            • 1、抓包,获取请求地址、参数、请求头
            • 2、使用代码模拟客户端发送请求,获取页面源码
            • 3、使用正则表达式从页面源码中获取排行榜中的电影信息

              Python高阶_第34张图片

          • 例2:下载图片
            • 1、抓包,获取请求地址、参数、请求头
            • 2、使用代码模拟客户端发送请求,获取页面源码
            • 3、从页面源码中获取图片的url
            • 4、请求每一个图片的url,下载图片

              Python高阶_第35张图片

          • 例3:带参数的get请求
            • url:百度安全验证

              Python高阶_第36张图片

        • POST请求
          • post(url[,data,headers,file])
            • url,请求地址
            • data,请求的参数,一般使用字典传入
            • headers,请求头
            • file,一般用于上传文件
          • 例1:woniusales登录功能

            Python高阶_第37张图片

        • 会话保持
          • 通过方法session()创建一个session对象,通过session对象发请求即可实现会话保持
          • 例:

            Python高阶_第38张图片

    • 高阶应用
      • 装饰器
        • 闭包函数
          • 定义:外函数中声明了一个内函数,在内函数中引用了外函数的变量,外函数返回内函数的引用,主要用于网络爬虫、延迟计算等领域。
          • 例1:Python高阶_第39张图片

          • 例2:Python高阶_第40张图片

          • 例3:内函数中修改外函数变量Python高阶_第41张图片

        • 装饰器
          • 在不改变函数的源码、调用方式的前提下,为函数添加新的功能
          • 通用装饰器模板:Python高阶_第42张图片

          • 例1:统计函数的运行时间Python高阶_第43张图片

          • 例2:为装饰器传参(三层结构)Python高阶_第44张图片
    • pytest框架
      • 模块:pytest
        • pip install pytest
      • 基本使用方法
        • 说明:
          • 函数名需要以test开头
          • 类名需要以Test开头,类中的方法需要以test开头
            • 类中不能有构造方法
          • 使用assert进行断言
          • 脚本名需要以test开头
        • 作用于函数

          Python高阶_第45张图片

        • 作用于类

      • 用例执行
        • 方式
          • 脚本:pytest.main([参数1,参数2,......])
          • 命令行
            • pytest 参数 脚本
            • py.test 参数 脚本
            • python -m pytest 参数 脚本
        • 参数
          • -s
          • -v
          • -q
          • -k,通过关键字匹配脚本、函数名、类名、方法名​​​​​​​
          • Python高阶_第46张图片
            • -m,对用例进行标记,执行指定的用例
              • 1、在项目根目录下新建文件pytest.ini
              • 2、在pytest.ini文件中添加标记
                • Python高阶_第47张图片
              • 3、使用装饰器标记测试用例@pytest.mark.标记
              • Python高阶_第48张图片
              • 4、执行测试时,使用-m 标记即可执行指定的用例
              • ​​​​​​​Python高阶_第49张图片 
          • -x,如果测试执行过程中有fail的用例,则测试立即停止
          • Python高阶_第50张图片
          • --maxfail=n,当失败的用例达到指定的数量n时,停止测试
          • Python高阶_第51张图片
        • 跳过用例
          • @pytest.mark.skip(reason=xxxx),无条件跳过指定用例
          • @pytest.mark.skipif(条件,reason=xxxx),有条件跳过指定用例
            • Python高阶_第52张图片
          • python.skip(msg),在方法内根据跳过用例

            Python高阶_第53张图片

      • 参数化
        • @pytest.mark.parametrize('参数1,参数2,....',值)
          • 参数,与被装饰的函数的形参相同
          • 值,传递给参数的数据,通常为一个列表,如果需要给多个参数传数据可以将这些数据封包到元组中
        • 例1:1个参数,几个值就代表有几条测试用例
          • Python高阶_第54张图片
        • 例2:多个参数,将每条用例封装到元组中
          • Python高阶_第55张图片

        • 例3:woniusales登录功能

          Python高阶_第56张图片

      • 前置后置
        • 模块级,作用范围为当前模块,模块中的所有用例执行前后分别运行1次前置和后置
          • setup_module(),前置,所有用例执行前运行1次
          • teardown_module(),后置,所有用例执行后运行1次

            Python高阶_第57张图片

        • 函数级,作用范围为当前模块中的每一个测试函数,模块中的每条用例执行前后分别运行1次前置和后置
          • setup_function(),前置,每条用例执行前运行1次
          • teardown_function(),后置,每条用例执行后运行1次

            Python高阶_第58张图片

        • 类级,作用范围为当前类,类中的所有用例执行前后分别运行1次前置和后置
          • setup_class(),前置,所有用例执行前运行1次
          • teardown_class(),后置,所有用例执行后运行1次

            Python高阶_第59张图片

        • 方法级,作用范围为当前类中的每一个测试方法,每条用例执行前后分别运行1次前置和后置
          • setup_method()或者setup(),前置,每条用例执行前运行1次
          • teardown_method()或者teardown(),后置,每条用例执行后运行1次

            Python高阶_第60张图片

        • 例:woniusales新增会员

          Python高阶_第61张图片

      • fixture
        • 创建:@pytest.fixture([name,scope,params,autouse])
          • name,指定fixture名称,如果不指定则默认为被装饰的函数名
          • scope,指定fixture作用范围,module、class、function(默认)、session、package
          • params,参数
          • autouse,设置为True,实现自动调用fixture
        • 例1:局部fixture

          Python高阶_第62张图片

        • 全局fixture
          • 1、在项目下创建conftest.py文件,在该文件中实现fixture

            Python高阶_第63张图片

          • 2、调用

            Python高阶_第64张图片

      • 测试报告
        • 模块:pytest-html
          • pip install pytest-html
        • 使用:在pytest的main函数中传入参数--html=path/filename.html
        • pytest.mark.parametrize()方法中的ids参数设置报告中的用例名称

你可能感兴趣的:(python)