python基础十一之装饰器进阶
函数的双下划线方法
def hahahha(): """测试函数""" print('zxc') print(hahahha.__name__) # 打印函数的名字 print(hahahha.__doc__) # 打印函数中的注释
wraps
被装饰函数的名字在使用装饰器后名字对应的内存地址会发生变化,通过__name__打印的名字将不再是函数自身的名字,为了解决这个问题,就要用wraps
from functools import wraps def func(fun): @wraps(fun) # 使被装饰的函数的名字不发生变化 def inner(*args, **kwargs): print('前面功能') ret = fun(*args, **kwargs) print('后面功能') return ret return inner @func def out(): print('zxc') print(out.__name__)
带参数的装饰器
# 带参数的装饰器 import time # FLAG = True FLAG = False def timmer_out(flag): def timmer(func): def inner(*args, **kwargs): if flag: start = time.time() ret = func(*args, **kwargs) end = time.time() print(end-start) return ret else: ret = func(*args, **kwargs) return ret return inner return timmer # timmer_out(FLAG) 相当于timmer 所以@timmer_out(FLAG)就相当于@timmer @timmer_out(FLAG) def test(): time.sleep(1) print('zxc') @timmer_out(FLAG) def test1(): time.sleep(1) print('zxf') test() test1()
多个装饰器装饰一个函数
# 多个装饰器装饰一个函数 def wrapper1(f): def innner(): print('wrapper1装饰的func之前') f() print('wrapper1装饰的func之后') return innner def wrapper2(f): def innner(): print('wrapper2装饰的func之前') f() print('wrapper2装饰的func之后') return innner @wrapper2 @wrapper1 def func(): print('func') func()