装饰器案例 python
一 装饰器
作用是为了将一个子模块加入新的功能,但是不修改原有的代码
二 案例
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'