一、完全伪装:将装饰函数彻底伪装成原函数,即所有属性要与原函数一致。
from functools import wraps def passer(func): @wraps(func) # 将wrapper完全复制传入的func的所有属性 def wrapper(*args, **kwargs): res = func(*args, **kwargs) return res return wrapper
二、有参装饰器:
1、无参装饰器的组成由内相外:
①原函数(原功能,原调用,原返回值)
②装饰函数(传入参数,定义新功能,返回原返回值)
③传递函数(传入原函数名,返回装饰函数)
2、有参装饰器在无参装饰器基础上增加:
④外函数(传入新功能所需参数,返回传递函数)
from functools import wraps def outter(extra): def passer(func): @wraps(func) def wrapper(*args, **kwargs): print(extra) res = func(*args, **kwargs) return res return wrapper return passer @outter('aaa') # outter()等于outter的返回值passer,再 通过语法糖@实现了add=passer(add),传入的值可被里层extra取用 def add(a, b): print(a + b)