一 装饰器
作用是为了将一个子模块加入新的功能,但是不修改原有的代码
二 案例
def operate(func): def wrapper(*args, **kwargs): # 闭包函数 value = func(*args, **kwargs) print(value, args, kwargs) return value return wrapper @operate def start_func(count, second="yes"): count = count * 10 print("这里是加了装饰器的函数 %d" % count) return count start_func(10, second="no")
输出:
这里是加了装饰器的函数 100 100 (10,) {'second': 'no'} 100
# 不含参数的装饰器
## 不含参数的装饰器 def jump_func(funcName): def build_in(a, b, c): # 这个函数要与 start_entrance 函数参数一致 b = "woman" print("-----before-----", a, b, c) change = funcName(a, b, c) print("-----after------", change) return change return build_in @jump_func def start_entrance(name, sex, age): # sex = "crazy" # age = 18 print("stat func:", name, sex, age) return (name, sex, age) result = start_entrance("honer", "man", 78)
输出:
-----before----- honer woman 78 stat func: honer woman 78 -----after------ ('honer', 'woman', 78)
有参数的装饰器
# 传递带有参数的装饰器,能在运行时,处理不同的功能 """ 1 先执行 trans_args("start") 函数,这个函数return 的结果是func这个函数的引用 2 @func 3 使用 @func 对start_entrance 进行装饰 """ def trans_args(arg): def func(funcName): def build_in(): if arg == "start": # 装饰器里的参数 result = funcName() print(result) return result else: result = funcName() return "not comparable" return build_in return func @trans_args("start") def start_entrance(): wrap = "嵌入其中的函数" print(wrap) return wrap res = start_entrance() @trans_args("from") def from_entrance(): variable = "hello, world" print(variable) return variable from_entrance()
输出:
嵌入其中的函数 嵌入其中的函数 hello, world 'not comparable'