专栏首页测试游记测试开发进阶(四)

测试开发进阶(四)

闭包

def func():
    print('----func----')

    def wrapper():
        print('----wrapper----')

    return wrapper

print(func())
"""
----func----
<function func.<locals>.wrapper at 0x103bb77b8>
"""
func()()
"""
----func----
----wrapper----
"""

满足闭包的条件

  • 函数中嵌套一个函数
  • 外层函数的返回值是内层函数的函数名
  • 内层嵌套函数对外部作用域有一个非全局变量的引用

闭包的作用

  • 实现数据锁定
# 数据锁定
def func2():
    num = 1000

    def wrapper():
        print(f'这里使用了num的值{num}')

    return wrapper

wrapper = func2()
num = 10000
wrapper() # 这里使用了num的值1000

装饰器

开放封闭原则:软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的

装饰器的作用:在不更改原功能函数内部代码,并且不改变调用方法的情况下为原函数添加新的功能。

@:语法糖

def decorator(num):
    def wrapper():
        print(num)

    return wrapper

decorator(1000)()
def decorator1(func):
    def wrapper():
        print(func)# 1⃣️
        func()

    return wrapper


def func():
    print('这是func')#2⃣️


wra = decorator1(func)
wra()
"""
<function func at 0x1142421e0>1⃣️
这是func2⃣️
"""

@decorator1 # 等价于func1 = decorator1(func1)
def func1():
    print('这是func')

func1()

一个作用域的错误

a = 100
def func():
    print(a)
    a = 999
func()
"""
Traceback (most recent call last):
  File "/Users/zhongxin/Desktop/py/zx/04/0812_2.py", line 14, in <module>
    func()
  File "/Users/zhongxin/Desktop/py/zx/04/0812_2.py", line 12, in func
    print(a)
UnboundLocalError: local variable 'a' referenced before assignment
"""

装饰器常见应用场景

  • 权限校验
  • 计算时间⌛️
  • 环境准备和恢复工作
  • web自动化用例失败截图

Chrome插件推荐-ChroPath

元素定位

web自动化用例失败截图

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')


def decorator(func):
    def wrapper():
        try:
            func()
        except:
            browser.save_screenshot('eroor.png')
            raise

    return wrapper


@decorator
def test_search():
    browser.find_element_by_id('kw').send_keys('selenium')
    browser.find_element_by_id('su11').click()


test_search()

截图

带参数的装饰器

def decorator(func):
    print('1')

    def wrapper(*args, **kwargs):
        print('2')
        func(*args, **kwargs)

    return wrapper


@decorator
def add_num(a, b):
    print(f'sum={a + b}')


add_num(11, 22)
"""
1
2
sum=33
"""

类实现装饰器

__call__:魔术方法,在对象使用括号调用的时候会触发

class MyDecorator(object):
    def __init__(self, func):
        self.func = func #⚠️⚠️⚠️

    def __call__(self, *args, **kwargs):
        print('这是__call__方法')
        self.func(*args, **kwargs)

    def func(self):
        print('这是MyDecorator的func方法')


@MyDecorator  # add_num = MyDecorator(add_num)
def add_num(a, b):
    print(f'sun={a + b}')


add_num(1, 2)

装饰器装饰类

def dceorator(func):
    def wrapper(*args, **kwargs):
        print('111')
        obj = func(*args, **kwargs)
        print('222')
        return obj

    return wrapper

@dceorator  # Hero = dceorator(Hero)
class Hero:
    def func(self):
        print('这是Hero的func')

h = Hero()
print(h)
h.func()
"""
111
222
<__main__.Hero object at 0x1033a4390>
这是Hero的func
"""

本文分享自微信公众号 - 测试游记(zx94_11),作者:zx钟

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 《流畅的Python》第七章学习笔记

    闭包指延伸了作用域的函数,其中包含了「函数定义体中引用」、「不在定义体中定义的非全局变量」

    zx钟
  • 《流畅的Python》第九章学习笔记

    使用双下划线开头的属性会存入到__dict__属性中,并且会在前面加上一个下划线和类名。

    zx钟
  • python基础-装饰器笔记

    函数装饰器用于在源码中“标记”函数,以某种方式增加函数的行为。这是一项强大的功能,但是若想要掌握,必须理解闭包。

    zx钟
  • python 之 函数 2

    什么是命名关键字参数? 格式:在*后面参数都是命名关键字参数 特点: 1 必须被传值 2 约束函数的调用者必须按照key=value的形式传值 3 约束函数的调...

    py3study
  • Python数据分析之NumPy(运算篇)

    应用场景:要用小的矩阵去和大的矩阵做一些操作,但是希望小矩阵能循环和大矩阵的那些块做一样的操作。

    AI异构
  • 去一家新公司使用p12文件进行真机测试

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

    用户1451823
  • 数据科学篇| Numpy 库的使用(一)

    实际上,标准的Python中,用列表保存数组的值。由于列表中的元素是任意的对象,所以列表中list保存的是对象的指针。虽然在Python编程中隐去了指针的概念,...

    润森
  • Go语言Goroutine与Channel内存模型

    Go语言内存模型规定了在一个goroutine中一个变量的读取的情况下,确保能够观察到在其他另外goroutine中写入同样变量的值。也就是说,如果在多个gor...

    李海彬
  • 使用禁忌搜索优化店面空间使商店收入最大化(AL LG)

    占地空间优化是零售商通常遇到的关键收入管理问题。通过对分配给最合适货架图的产品类别进行最佳分配,可以最大程度地增加商店收益。我们将该问题表述为具有附加全局约束的...

    田冠宇
  • 如何在Python中使用静态变量在计数

    今天,在用Python写一个统计一个文件下有多少文件的小标本时,遇到了一个很棘手的问题。如何在Python中使用静态变量来计数。然后,就在网上一通查找,找的方法...

    py3study

扫码关注云+社区

领取腾讯云代金券