调用父类方法的方式
在Python中,如果子类想要调用父类的方法,有以下三种常见的方式:
● 直接使用父类名.方法名 (self) 的形式,例如 Master.make_cake (self)。
● 使用 super (子类名,self).父类方法名 () 的形式,例如 super (Prentice, self).make_cake ()。这种方式适用于新式类,可以自动找到合适的父类方法。
● 使用 super ().父类方法名 () 的形式,例如 super ().make_cake ()。这种方式是第二种方式的简写,也适用于新式类,但不需要指定子类名和self。
如果子类重写了父类的构造方法(__init__),那么在子类的构造方法中,需要显式地调用父类的构造方法,否则父类的构造方法不会执行。调用父类的构造方法有两种方式:
● 使用 super (子类名,self).__init__ (参数) 的形式,例如 super (Person, self).__init__ (name)。
● 使用 父类名.__init__ (self, 参数) 的形式,例如 People.__init__ (self, name)。这种方式称为未绑定方法,需要手动给self传值。
如果涉及到多继承,那么super函数只能调用第一个直接父类的构造方法,如果要调用其他父类的构造方法,需要使用未绑定方法。
下面是一个简单的例子,演示了Python中调用父类方法的用法:
# 定义一个父类
class Animal:
def __init__(self, name):
self.name = name
print(f"我是{self.name}")
def run(self):
print(f"{self.name}在跑")
# 定义一个子类
class Dog(Animal):
def __init__(self, name, color):
# 调用父类的构造方法
super().__init__(name)
self.color = color
print(f"我的颜色是{self.color}")
def bark(self):
print(f"{self.name}在叫")
def run(self):
# 调用父类的run方法
super().run()
print(f"{self.name}跑得快")
# 创建一个子类对象
d = Dog("旺财", "黑色")
# 调用子类自己的方法
d.bark()
# 调用父类的方法
d.run()
输出结果为:
我是旺财
我的颜色是黑色
旺财在叫
旺财在跑
旺财跑得快
接口自动化测试中的应用
在接口自动化测试中,我们经常需要使用继承和多态的特性,来实现代码的复用和扩展。例如,我们可以定义一个基础的接口测试类,封装一些通用的方法,如发送请求、断言响应、记录日志等。然后,我们可以根据不同的接口需求,定义不同的子类,继承基础的接口测试类,并重写或添加一些特定的方法,如构造参数、处理数据、生成报告等。这样,我们就可以利用父类的方法,简化子类的代码,同时也可以根据子类的特点,定制化测试逻辑。
下面是一个简单的例子,演示了接口自动化测试中调用父类方法的用法:
# 导入requests库
import requests
# 定义一个基础的接口测试类
class BaseApiTest:
# 定义一个构造方法,初始化基础的url和headers
def __init__(self, base_url, headers):
self.base_url = base_url
self.headers = headers
# 定义一个发送get请求的方法
def get(self, path, params=None):
# 拼接完整的url
url = self.base_url + path
# 发送get请求,并返回响应对象
return requests.get(url, params=params, headers=self.headers)
# 定义一个发送post请求的方法
def post(self, path, data=None, json=None):
# 拼接完整的url
url = self.base_url + path
# 发送post请求,并返回响应对象
return requests.post(url, data=data, json=json, headers=self.headers)
# 定义一个断言响应状态码的方法
def assert_status_code(self, response, expected_code):
# 获取实际的状态码
actual_code = response.status_code
# 判断实际的状态码是否等于期望的状态码
assert actual_code == expected_code, f"状态码错误,期望为{expected_code},实际为{actual_code}"
# 定义一个断言响应内容的方法
def assert_content(self, response, expected_content):
# 获取实际的响应内容
actual_content = response.text
# 判断实际的响应内容是否包含期望的内容
assert expected_content in actual_content, f"响应内容错误,期望包含{expected_content},实际为{actual_content}"
# 定义一个子类,继承基础的接口测试类,用于测试百度搜索接口
class BaiduSearchApiTest(BaseApiTest):
# 定义一个构造方法,调用父类的构造方法,初始化基础的url和headers
def __init__(self):
super().__init__("https://www.baidu.com", {"User-Agent": "Mozilla/5.0"})
# 定义一个搜索的方法,调用父类的get方法,发送搜索请求,并返回响应对象
def search(self, keyword):
return self.get("/s", params={"wd": keyword})
# 定义一个测试搜索的方法,调用搜索的方法,获取响应对象,并调用父类的断言方法,验证响应结果
def test_search(self, keyword, expected_content):
response = self.search(keyword)
self.assert_status_code(response, 200)
self.assert_content(response, expected_content)
# 创建一个子类对象
baidu = BaiduSearchApiTest()
# 调用测试搜索的方法,传入搜索关键字和期望的内容
baidu.test_search("python", "Python官网")
输出结果为:
无异常,测试通过