4、API 接口自动化测试详细图文教程学习系列4--相关Python基础知识3

测试学习记录,仅供参考!

Python 基础知识

学习了解 API 接口自动化测试所需要的 python 基础知识点,此处仅简单介绍;

五、类和对象

类的定义

主要使用class 关键字定义类。

class 类名

在类里面可以定义类的变量

在类里面可以使用 def 关键字定义类的方法

复制代码
# 创建定义一个类名 ReadData
class ReadData:
    # 初始化构造函数 __init__
    def __init__(self,name,age):    # 参数变量名 name、age
        self.name = name            # 定义实例属性 name--再把参数name传给它
        self.age = age              # 定义实例属性 age--再把参数age传给它
    # 创建定义一个方法 get_name
    def get_name(self):
        # 在方法里面可以直接调用实例属性 name
        return self.name

# 如何调用?--read 实例化属性--ReadData() 实例化类--因为初始化里面有两个参数,所以需要传入两个
read = ReadData('张三',18)
# 通过类的实例属性去调用--类里面的方法 get_name--再把结果返回出去赋值给res
res = read.get_name()
# 打印res
print(res)


输出运行结果
张三

类的反射

类的反射机制,在python中,类的反射是指通过字符串形式的类名或属性来访问对应类或属性,在python中提供了一些内置函数,使得可以通过字符串的形式动态的访问类和类的属性;

复制代码
# 创建定义一个类名 ReadData
class ReadData:
    # 初始化构造函数 __init__
    def __init__(self,name,age):    # 参数变量名 name、age
        self.name = name            # 定义实例属性 name--再把参数name传给它
        self.age = age              # 定义实例属性 age--再把参数age传给它
    # 创建定义一个方法 get_name
    def get_name(self):
        # 在方法里面可以直接调用实例属性 name
        return self.name

# 如何调用?--read 实例化属性--ReadData() 实例化类--因为初始化里面有两个参数,所以需要传入两个
read = ReadData('张三',18)

# getattr(object,name,default)函数用于获取对象的属性
# 访问类的属性------第一个参数是类的对象,第二个参数是要访问的属性,第三个属性不存在,返回默认值
name_1 = getattr(ReadData('LiSi',16),'name')
# 当通过这个 age 属性去访问类里面有没有这个属性,若有,则直接访问类里面的这个属性,
name_2 = getattr(ReadData('LiSi',17),'age')
# 当通过这个 sex 属性去访问类里面有没有这个属性,若没有,则返回设置的第三个参数设置的默认值
name_3 = getattr(ReadData('LiSi',18),'sex','boy')

# 或者访问类的方法--ps:函数调用必须要加上括号才是函数调用
funcs_1 = getattr(ReadData('ZhangSan',18),'get_name','boy')()
# 没有时,不需要再加括号调用------做自动化测试时,一般是不会用到第三个参数的,只用到一两个参数就行了
funcs_2 = getattr(ReadData('ZhangSan',18),'get_name_07','类里面没有get_name_07这个方法名')
print(name_1,name_2,name_3)
print(funcs_1,funcs_2)


输出运行结果
LiSi 17 boy
ZhangSan 类里面没有get_name_07这个方法名

面向对象

面向对象的程序设计过程中有两个重要概念:类(class)和对象(object,也被称为实例 instance),其中类是某一批对象的抽象,可以把类理解成某种概念;对象才是一个具体存在的实体。

Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。对象可以包含任意数量和类型的数据。

  • **类(Class):**用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • **方法:**类中定义的函数。
  • **类变量:**类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • **数据成员:**类变量或者实例变量用于处理类及其实例对象的相关的数据。
  • **方法重写:**如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • **局部变量:**定义在方法中的变量,只作用于当前实例的类。
  • **实例变量:**在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
  • **继承:**即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
  • **实例化:**创建一个类的实例,类的具体对象。
  • **对象:**通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

六、序列化和反序列化

Json数据 和 Python中的 字典数据类型非常相似,但是有一点细微区别,json数据必须使用双引号,python字典则可以使用 单引号或双引号;

JSON 数据和字典数据

复制代码
# 1、序列化
# 创建一个json数据--ps:必须使用 双引号
json_data = {
    "name": "ZhangSan",
    "age": 18,
    "sex": "男"
}
print(json_data)


输出运行结果
{'name': 'ZhangSan', 'age': 18, 'sex': '男'}

查看 json 数据和字典数据;

复制代码
# 1、序列化
# 创建一个json数据--ps:必须使用 双引号
json_data = {
    "name": "ZhangSan",
    "age": 18,
    "sex": "男"
}
print(json_data)

# 创建一个字典数据--字典可以是 单引号 也可以是 双引号
json_data_dict = {
    'name': 'LiSi',
    "age": 20,
    "sex": "女"
}
print(json_data_dict)


输出运行结果
{'name': 'ZhangSan', 'age': 18, 'sex': '男'}
{'name': 'LiSi', 'age': 20, 'sex': '女'}

序列化--转换数据为字符串格式

使用 json.dumps() 方法 把json数据转换为字符串(其实就相当于把字典转为字符串);在python控制台中,若出现 双引号,一般是 字符串;若出现 单引号,则一般是 字典 类型;

复制代码
# 引入json模块
import json
# json序列化和反序列化
# 序列化--简单的理解:就是把python的数据类型对象转换为字符串
# 创建一个json数据--这里相当于是一个字典类型
json_data = {
    "name": "ZhangSan",
    "age": 18,
    "sex": "男"
}
# 使用 json.dumps() 方法 把json数据转换为字符串--其实就相当于把字典转为字符串
json_str_01 = json.dumps(json_data)
# 这里默认为GBK编码,若想显示中文字符,需加参数 ensure_ascii--它的默认值为 True,这里改为 False
json_str_02 = json.dumps(json_data, ensure_ascii=False)
print(json_str_01)
print(json_str_02)
print(type(json_str_01))
print(type(json_data))


控制台输出运行结果
{"name": "ZhangSan", "age": 18, "sex": "\u7537"}
{"name": "ZhangSan", "age": 18, "sex": "男"}
<class 'str'>
<class 'dict'>

反序列化

把Python内存对象的字符串转换成Python的数据类型;

复制代码
# 引入json模块
import json
# json序列化和反序列化
# 序列化--简单的理解:就是把python的数据类型对象转换为字符串
# 创建一个json数据--这里相当于是一个字典类型
json_data = {
    "name": "ZhangSan",
    "age": 18,
    "sex": "男"
}
# 打印 json_data 数据类型
print(type(json_data))
# 使用 json.dumps() 方法 把json数据转换为字符串--其实就相当于把字典转为字符串
json_str_01 = json.dumps(json_data)
# 这里默认为GBK编码,若想显示中文字符,需加参数 ensure_ascii--它的默认值为 True,这里改为 False
json_str_02 = json.dumps(json_data, ensure_ascii=False)
print(json_str_01)
print(json_str_02)
print(type(json_str_01))

# 反序列化--简单理解:就是把Python内存对象的字符串转换成Python的数据类型
data_dict = json.loads(json_str_01)
print(data_dict)
print(type(data_dict))


控制台输出运行结果
<class 'dict'>
{"name": "ZhangSan", "age": 18, "sex": "\u7537"}
{"name": "ZhangSan", "age": 18, "sex": "男"}
<class 'str'>
{'name': 'ZhangSan', 'age': 18, 'sex': '男'}
<class 'dict'>

七、数据异常处理

异常是指程序运行的过程中出现了错误,也叫 Bug。Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。

异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个异常。异常是Python对象,表示一个错误。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。

如果出现程序异常,不去捕获和处理,那么程序遇到异常,就会直接终止,后续的代码无法继续执行,这将是可怕的事情。Python 提供了完善的异常处理机制,可以实现捕获异常、处理异常,最终实现代码继续执行下去;从而让程序具体极好的容错性,让程序更加的健壮。

使用 try...except 语句捕获异常

基本语法:

try:

可能会有异常的代码

except:

出现异常的执行代码

复制代码
# 异常处理,语法 try except
try:
    pass
except Exception as e:
    pass
异常处理

异常处理,一般建议先写完整的异常代码结构块;

复制代码
# 定义一个方法 functions_01
def functions_01():
    list_data = ['赵大','钱二','孙三','李四']
    # 异常处理,语法 try except
    try:
        res = list_data[2]
        print(res)
    except Exception as e:
        print(f'出现了未知异常,原因为: {e}')
# 调用函数--直接通过 函数名()
functions_01()


运行结果
孙三
未知异常处理
复制代码
# 定义一个方法 functions_01
def functions_01():
    list_data = ['赵大','钱二','孙三','李四']
    # 异常处理,语法 try except
    try:
        res = list_data[20]
        print(res)
    except Exception as e:
        print(f'出现了未知异常,原因为: {e}')
# 调用函数--直接通过 函数名()
functions_01()


运行结果
出现了未知异常,原因为: list index out of range
try/except...else 语句

try/except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。

else 子句将在 try 子句没有发生任何异常的时候执行。

vb 复制代码
`# 定义一个方法 functions_01
def functions_01():
    list_data = ['赵大','钱二','孙三','李四']
    # 异常处理,语法 try except
    try:
        res = list_data[20]
        print(res)
    except Exception as e:
        print(f'出现了未知异常,原因为: {e}')
    else:
        print('try代码块没有出现异常,执行这里的代码')
# 调用函数--直接通过 函数名()
functions_01()


运行结果
出现了未知异常,原因为: list index out of range`

使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到,而 except 又无法捕获的异常。异常处理并不仅仅处理那些直接发生在 try 子句中的异常,而且还能处理子句中调用的函数(甚至间接调用的函数)里抛出的异常。

复制代码
# 定义一个方法 functions_01
def functions_01():
    list_data = ['赵大','钱二','孙三','李四']
    # 异常处理,语法 try except
    try:
        res = list_data[2]
        print(res)
    except Exception as e:
        print(f'出现了未知异常,原因为: {e}')
    else:
        print('try代码块没有出现异常,执行这里的代码')
# 调用函数--直接通过 函数名()
functions_01()


运行结果
孙三
try代码块没有出现异常,执行这里的代码
try-finally 语句

try-finally 语句无论是否发生异常都将执行最后的代码;

复制代码
# 定义一个方法 functions_01
def functions_01():
    list_data = ['赵大','钱二','孙三','李四']
    # 异常处理,语法 try except
    try:
        res = list_data[20]
        print(res)
    except Exception as e:
        print(f'出现了未知异常,原因为: {e}')
    else:
        print('try代码块没有出现异常,执行这里的代码')
    finally:
        print('不管有没有异常,都执行这里的代码')
# 调用函数--直接通过 函数名()
functions_01()


"""
打印结果:
出现了未知异常,原因为: list index out of range
不管有没有异常,都执行这里的代码
"""

finally: 这个代码块的作用

后续做一些 文件的读写操作,数据库的读写操作、连接、关闭 等, 不管有没有异常,均会释放一些内存资源的作用;

常用的异常处理
复制代码
# 异常处理,语法 try except
try:
    res = list_data[20]
    print(res)
except Exception as e:
    print(f'出现了未知异常,原因为: {e}')
finally:
    print('不管有没有异常,都执行这里的代码')

未完待续。。。

相关推荐
Meepo_haha2 小时前
python的sql解析库-sqlparse
数据库·python·sql
学机械的鱼鱼2 小时前
【学习笔记】如何快速理解ROS2
笔记·学习
夏日清风有你2 小时前
MNIST手写数字图像
python
red_redemption2 小时前
自由学习记录(145)
学习
sqyno1sky2 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
醇氧2 小时前
【学习】封锁协议
网络·学习·oracle
前端小趴菜~时倾2 小时前
自我提升-python爬虫学习:day03
爬虫·python·学习
新缸中之脑2 小时前
NotebookLM:最佳学习工具
人工智能·学习·chatgpt
LightYoungLee2 小时前
大模型(七)Agent AI学习笔记
人工智能·笔记·学习