# 装饰器功能说明
"""
python中的装饰器(decorator)一般采用语法糖的形式,是一种语法格式。
比如:@classmethod,@staticmethod,@property,@xxx.setter,@wraps(),@func_name等都是python中的装饰器。
装饰器,装饰的对象是函数或者方法。各种装饰器的作用都是一样的:改变被装饰函数或者方法的功能,性质。
"""
import time
def how_much_time(func):
print("how_much_time函数开始运行")
def inner():
t_start = time.time()
func()
t_end = time.time()
print(f"一共花费了{t_end - t_start:.6f}秒时间")
return inner
# @how_much_time等价于sleep_1s = how_much_time(sleep_1s)
@how_much_time
def sleep_1s():
"""
how_much_time函数开始运行
1秒结束了
一共花费了1.007465秒时间
"""
time.sleep(1)
print("%d秒结束了" % (1,))
sleep_1s() # 执行
def mylog(func):
print("mylog函数开始运行")
def inner_2():
print("start")
func()
print("end")
return inner_2
# 多个装饰器demo1,等价于mylog(how_much_time(sleep_more))
@mylog
@how_much_time
def sleep_more():
"""
how_much_time函数开始运行
mylog函数开始运行
start
2秒结束了
一共花费了2.003144秒时间
end
"""
time.sleep(2)
print("%d秒结束了" % (2,))
sleep_more()
def add(func):
def inner():
x = func()
x = x + 1
print("add方法执行,x:", x)
return x
return inner
def cube(func):
def inner():
x = func()
x = x * x * x
print("cube方法执行,x:", x)
return x
return inner
def square(func):
def inner():
x = func()
x = x * x
print("square方法执行,x:", x)
return x
return inner
# 多装饰器demo2,先square,再cube,最后add
@add
@cube
@square
def test():
"""
square方法执行,x: 4
cube方法执行,x: 64
add方法执行,x: 65
65
"""
return 2
print(test())
# 带参数的装饰器
print("", sep="\n")
print("#" * 5, "带参数的装饰器", "#" * 5, sep=" ")
def logger(msg):
def time_master(func):
def inner():
start = time.time()
func()
end = time.time()
print(f"{msg}函数执行耗时{end - start:.4f}")
return inner
return time_master
@logger(msg="my_fun")
def my_fun():
"""
my_fun正在执行
my_fun函数执行耗时1.0109
"""
print("my_fun正在执行")
time.sleep(1)
my_fun() # 等于没有装饰器时的调用 logger(msg="my_fun")(my_fun)()