摘要:Python中的链式调用(Method ChAIning),也称为方法链式调用,是一种编程风格,其中一个对象的方法在执行完毕后返回该对象本身(通常是self),从而允许你在一个单独的表达式中连续调用多个方法。
Python中的链式调用(Method ChAIning),也称为方法链式调用,是一种编程风格,其中一个对象的方法在执行完毕后返回该对象本身(通常是self),从而允许你在一个单独的表达式中连续调用多个方法。
这种风格使得代码更加简洁,并且能够以一种流畅的接口风格(Fluent Interface)编写代码。
下面介绍Python中的一些链式调用。
01
链式调用与列表推导式
虽然严格来说列表推导式不是一种方法链,但可以看作是一种链式操作,因为它将多个操作(过滤和映射)压缩成一行代码。
# 原始列表numbers = [1, 2, 3, 4, 5, 6]# 链式调用:过滤和映射squared_evens = [x ** 2 for x in numbers if x % 2 == 0]print(squared_evens) # 输出: [4, 16, 36]有时候,你可能想要在推导式中使用链式方法调用,但这需要一些技巧,因为推导式不支持直接的链式调用。不过,你可以使用map和filter函数来实现类似效果:
# 使用map和lambda表达式来实现链式调用的效果strings = ['hello', 'tester', 'work', 'is', 'testing']upper_case_lengths = list(map(lambda s: len(s.upper), filter(lambda s: s != 'is', strings)))print(upper_case_lengths)# 输出: [5, 6, 4, 7]在这个例子中,我们首先使用filter来过滤掉字符串'is',然后使用map和lambda表达式来计算剩余字符串转换为大写后的长度。
02
字符串方法
字符串对象提供了许多方法,这些方法返回一个新的字符串对象,因此可以进行链式调用。
s = " Hello, Tester! "# 链式调用:去除首尾空格、转换为大写、替换字符new_s = s.strip.upper.replace("HELLO", "您好")print(new_s)# 输出: 您好, TESTER!上面介绍了Python内置的或可以通过一些技巧达到链式调用效果的链式表达式。其实在一些第三方库中也可以经常看的他的身影。
03
Pandas库中的链式调用
Pandas是一个数据分析库,它提供了许多可以链式调用的方法。
import pandas as pddf = pd.DataFrame({'A': [1, 2, 3, 4],'B': [4, 5, 6, 7]})# 选择列、过滤行、求和sum_b = df[df['A'] % 2 == 0]['B'].sumprint(sum_b)# 输出: 12上面示例是求出列A中为偶数的行对应的列B的值的总和。
过程是先计算列A中每个元素是否为偶数,结果是一个布尔Series,然后使用布尔索引来选择A列为偶数的行,接着选择过滤后的B列,最后计算B列中所有值的总和。
04
Playwright 库中的链式调用
Playwright是一个由微软开发的开源自动化测试工具,用于测试网页应用。他也有很多链式调用的方法。
from playwright.sync_api import sync_playwrightplaywright = sync_playwright.startbrowser = playwright.chromium.launch(headless=False)context = browser.new_contextpage = context.new_pagepage.goto("https://www.baidu.com")# 定位 form 标签、定位 id=su 元素、查找含有“百度一下”文字的元素、取满足条件的第一个、点击一下page.locator('form').locator('#su').filter(has_text="百度一下").first.clickbrowser.closeplaywright.stop如上示例,在百度首页点击百度一下按钮时就使用到了链式调用。
首先定位 form 标签元素,然后在 form 标签元素下定位 id=su 元素, 再接着使用filter通过文本内容对查找到的元素进行过滤,最后再取所有符合要求的元素的第一个并点击一下。
了解了链式调用的概念和示例,接下来自定义一个链式调用类。在写代码时需要确保类中的每个方法在执行完毕后返回类实例本身(self)。
示例如下:
from playwright.sync_api import sync_playwright, Pageclass TestBrowser:def __init__(self, page: Page):self.page = pagedef navigate_to(self, url):self.page.goto(url)# 返回自身以支持链式调用return selfdef find_element(self, selector):element = self.page.locator(selector)# 实例中添加找到的元素self.__setattr__('element', element)# 返回自身以支持链式调用return selfdef click(self):self.element.click# 返回自身以支持链式调用return selfdef fill(self, text):self.element.fill(text)# 返回自身以支持链式调用return selfdef press(self, key):self.element.press(key)# 返回自身以支持链式调用return selfplaywright = sync_playwright.startbrowser = playwright.chromium.launch(headless=False)context = browser.new_contextpage = context.new_pagepage = TestBrowser(page)# 使用链式调用page.navigate_to('http://www.baidu.com').find_element('#kw').fill('Tester').press('Enter')browser.closeplaywright.stop上述代码是一个使用Playwright进行自动化测试的Python脚本。
定义了一个TestBrowser类,该类封装了Playwright的一些基本操作,以支持链式调用。
TestBrowser类的构造函数接受一个Page对象,并将其保存在实例变量self.page中。
封装navigate_to方法使页面打开指定的URL,并返回self以支持链式调用;
封装了find_element方法查找页面上的元素,并将其保存在实例变量self.element中,然后返回self以支持链式调用;
封装了click方法来点击之前找到的元素,并返回self以支持链式调用;
封装了fill方法,在之前找到的元素中填充文本,并返回self以支持链式调用;
封装了press方法来模拟按键操作,并返回self以支持链式调用。
最后通过一行代码
page.navigate_to('http://www.baidu.com').find_element('#kw').fill('Tester').press('Enter') 使用链式调用来导航到百度首页,找到搜索框,填充文本"Tester",然后模拟按下回车键。
☑️一起交流行业热点、测试技术各种干货
☑️一起共享面试经验、跳槽求职各种好用的
即可加入领取 ⬇️⬇️⬇️
转行、入门、提升、需要的各种干货资料
内含AI测试、 车载测试、自动化测试、银行、金融、游戏、AIGC...
来源:建辉教育