补充:
保留原函数信息,如函数名,函数注释等内容
import functools def wrapper(func): @functools.wraps(func)#保留原函数的原信息,如函数名,函数备注之类数据,否则被装饰过的函数名会变成inner def inner(*args,**kwargs): return func(*args,**kwargs) return inner def f1(): print('f1') @wrapper def f2(): print('f1') print(f1.__name__) print(f2.__name__)
软件开发应该遵循“开放--封闭”原则。语法糖可满足该需求,官方名称即装饰器。
- 封闭:已实现的功能代码块不应该被修改
- 开放:对现有功能的扩展开放
#定义一个装饰器函数 def login(func): def _inner(): #xxxx func() return _inner #调用login装饰器,对home()方法进行登陆控制 @login def home(): pass
函数需参数的装饰器
#函数需参数的装饰器函数 def login(func): def _inner(*arg,**kwargs) #xxxx func(*arg,**kwargs) return _inner #函数传入参数index @login def home(index): pass
装饰器需参数的装饰器
#装饰器带参数的装饰器 def login(auth_type): def _outer(func): def _inner(*arg,**kwargs) #登陆验证代码写这里,xxxx func(*arg,**kwargs) return _inner return _outer #函数和装饰器都带参数 @login('wx') def home(index): pass