一、闭包
满足条件:
1. 函数内嵌套一个函数;
2.外层函数的返回值是内层函数的函数名;
3.内层嵌套函数对外部作用域有一个非全局变量的引用;
def func(): print("===func====") num=2 def wrapper(): print("------wrapper------") print(num2) # 或者直接引用func的传参 return wrapper res=fun() res()
闭包的作用:实现数据锁定,不受外部影响。
二、装饰器
开放封闭原则:面向对象的核心。软件实体应当是可扩展,而不可修改的。也就是说,对扩展是开放的,对修改是封闭的。
装饰器:在不改变原来函数功能的情况下,进行扩展。同时,不改变调用方式。
使用:@装饰器名称。 @为装饰器的语法糖
常见应用场景:
1. 权限校验,预判断是否有执行函数功能的权限;
2. 计时,计算函数运行时间;
3. 进行环境准备和恢复工作;
4. web自动化用例失败截图;
# 示例4:失败截图装饰器 from selenium import webdriver browser=webdriver.Chrome() browser.get("https://www.baidu.com") def decorator(func): def wrapper(): try: func() except: browser.save_screenshots("error.png") raise e return wrapper @decorator def test_search(): browser.find_element_by_xpath("//input[@id='kw']").sendkeys("ninmen") browser.find_element_by_xpath("//input[@id='su123']").click() test_search()
1、普通装饰器
def decorator(func): def wrapper(): print("----这是装饰器内层函数----") func() return wrapper @decorator # 等同于执行func = decorator(func) def func(): print("====这是原功能函数====") func() # 此时,不改变调用方式的同时,实现了功能扩展
2、带参数的装饰器
3、通用装饰器
#带参数 def decorator(func): def wrapper(a,b): print("----这是装饰器内层函数----") func(a,b) return wrapper #通用 def decorator(func): def wrapper(*args,**kwargs): print("----这是装饰器内层函数----") func(*args,**kwargs) return wrapper @decorator # 等同于执行func = decorator(func) def func(a,b): print("====求和====",a+b) func()
4、类实现装饰器
__call__:魔术方法,在对象使用括号时被触发
class Decorator(): '''类实现通用的装饰器''' def __init__(self,func): self.func=func def __call__(self,*args,**kwargs): print("----这是装饰器内层函数----") return self.func(*args,**kwargs) @Decorator # 等同于执行func = Decorator(func) def func(a,b): print("====求和====",a+b)
5、装饰器装饰类
class Decorator(): '''类实现通用的装饰器''' def __init__(self,func): self.func=func def __call__(self,*args,**kwargs): print("----这是装饰器内层函数----") return self.func(*args,**kwargs) @Decorator # 等同于执行func = Decorator(Hero) class Hero: def func(a,b): print("====求和====",a+b) h=Hero() h.func() #也可以使用 2中的通用装饰器 def decorator(func): def wrapper(*args,**kwargs): print("扩展功能") obj=func(*args,**kwargs) return obj #返回类对象 return wrapper @decorator # 等同于执行func = decorator(Hero) class Hero: def func(a,b): print("====求和====",a+b) h=Hero() h.func()
6、三个内置的装饰器