软件测试之python--装饰器
1. python装饰器
装饰器是在不修改原有函数的情况下,给函数增加功能。

如图1,在第二个f1被调用的时候,第一个f1以参数的形式传递到w1,在w1被调用的时候,会返回函数本身,就是图中的inner.这时,程序会先执行print("-----正在验证---")然后再执行func(),其实就是第一个f1。通过上面的操作,就给第一个f1增加了一个功能--print("-----正在验证---")

如图2,在图1的基础上,我们做了改进,将f1 = w1(f1) 以@w1的形式写在函数的顶部,这是python自带的一种语法。这样的好处是可以方便的给很多个函数增加装饰器,而不用每次调用一个函数都要写fn = w1(fn)

如图3,当1个函数有2个装饰器的时候。会先执行第一个装饰器,但是第一个装饰器需要装配的是一个函数,而这个函数是被第二个装饰器装配之后的f1.所以,图3的output就是:
--正在验证权限1--
--正在验证权限2--
-----1------
<a><b>hello</b>/<a>
问:python 装饰器,作用,用法
答:python 装饰器是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于他的返回值也是一个函数,使用 python 装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。一般而言,我们想要拓展原来函数代码,最直接的办法就是侵入到函数里面做修改,但是如果不允许修改原有核心函数,需要用装饰器自己写一下,可以定义一个函数,他的参数是一个函数,然后对这个新的函数进行修改,可以拓展函数功能
需要注意的:
1、实质:装饰器是一个函数
2、参数:是你要装饰的函数名(并非函数调用);
3、返回:是装饰完的函数名(非函数调用);
4,作用:为已经存在的对象添加额外的功能;
5、特点:不需要对对象做任何的代码上的改变
from functools import wraps
import time
# 函数的函数装饰器
def decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
func()
end_time = time.time()
print(end_time - start_time)
return wrapper
@decorator
def func():
time.sleep(0.8)
func()
# 类方法的函数装饰器
def decorator(func):
def wrapper(me_instance):
start_time = time.time()
func(me_instance)
end_time = time.time()
print(end_time - start_time)
return wrapper
class Method(object):
@decorator
def func(self):
time.sleep(0.8)
p1 = Method()
p1.func()
# 类装饰器
class Decorator(object):
def __init__(self, f):
self.f = f
def __call__(self):
print('decorator start')
self.f()
print("decorator end")
@Decorator
def func():
print("func")
func()
# 装饰器库--functools
def decorator(func):
@wraps(func)
def inner_function():
pass
return inner_function
@decorator
def func():
pass
print(func.__name__)
# 一个面试题,要求给当前运行的函数打上时间标签
def run_time(func):
def wrapper(*x, **y):
print(time.time())
func(*x, **y)
return wrapper
@run_time
def run(*x, **y):
print(x)
print(y)
def run2(*n, **m):
print(n)
print(m)
run(1, 2, key='value')
run2(3, 4, key='value')

浙公网安备 33010602011771号