文章目录
- 1、装饰器
- 2、无参装饰器
- 3、带有返回值装饰器
- 4、带参装饰器
- 5、双层函数装饰器
- 6、无参类装饰器
- 7、带参类装饰器
- 8、装饰器应用
1、装饰器
就是给已有函数增加额外功能的函数,它本质上就是一个闭包函数。
特点:
不修改已有函数的源代码
不修改已有函数的调用方式
给已有函数增加额外的功能
2、无参装饰器
def decorator(func):
def wrapper(*args,**kwargs):
print("小明穿衣服,刷牙洗脸")
func(*args,**kwargs)
print("打开电脑,开始上课")
return wrapper
@decorator # people = decorator(people)
def people():
print("小明准备去上课")
people()
3、带有返回值装饰器
def decorator(func):
def wrapper(name):
print("小明穿衣服,刷牙洗脸")
status = func(name)
print(status)
print("小明打开电脑")
return "小明开始上课"
return wrapper
@decorator
def people(name):
print(name,"洗漱完毕")
return name + "准备去上课"
res = people("小明")
print(res)
4、带参装饰器
def outer(name):
def decorator(func):
# def wrapper(*args,**kwargs):
def wrapper(name):
print(name,"穿衣服,刷牙洗脸")
# status = func(*args,**kwargs)
status = func(name)
print(status)
print(name,"打开电脑")
return name + "开始上课"
return wrapper
return decorator
@outer("小明") # people = outer("小明")(people)
def people(name):
print("小明洗漱完毕")
return "小明准备去上课"
res = people("小明")
print(res)
5、双层函数装饰器
多个装饰器可以对函数进行多个功能的装饰,装饰顺序是由内到外的进行装饰
def decorator1(func): # func = wrapper2
def wrapper1(*args,**kwargs):
print("小明穿衣服",end="")
status = func(*args,**kwargs)
print(status)
print("小明关闭电脑")
return "小明下课"
return wrapper1
def decorator2(func): # func = people
def wrapper2(*args,**kwargs):
print(",刷牙洗脸")
status = func(*args,**kwargs)
print(status)
print("小明打开电脑")
return "小明开始上课"
return wrapper2
@decorator1
@decorator2 # 1、people = decorator2(people) 2、people = decorator1(people) ===> people=wrapper1 3、people() ===> wrapper1()
def people():
print("小明洗漱完毕")
return "小明准备去上课"
res = people()
print(res)
6、无参类装饰器
class Decorator():
def __init__(self,func):
self.func = func
def __call__(self, *args, **kwargs):
print("小明穿衣服,刷牙洗脸")
status = self.func(*args, **kwargs)
print(status)
print("小明打开电脑")
return "小明开始上课"
@Decorator
def people():
print("小明洗漱完毕")
return "小明准备去上课"
res = people()
print(res)
7、带参类装饰器
class Outer():
def __init__(self,name):
self.name = name
def __call__(self, func):
return self.Decorator(func)
class Decorator():
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("小明穿衣服,刷牙洗脸")
status = self.func(*args, **kwargs)
print(status)
print("小明打开电脑")
return "小明开始上课"
@Outer("小明") # Outer("小明")(people)
def people():
print("小明洗漱完毕")
return "小明准备去上课"
res = people()
print(res)
8、装饰器应用
计时器
import time
def timer(func):
def wrapper(*args,**kwargs):
start = time.time()
a = func(*args,**kwargs)
end = time.time()
total_time = end - start
return f"程序执行时长:{total_time}"
return wrapper
@timer #
def hello(n):
time.sleep(n)
return 10
if __name__ == '__main__':
s = int(input("请输入执行时长>>>")) # 第一步
print(hello(s))
"""
第一步:遇到@timer 立即执行 hello = timer(hello) 将立即调用 timer(func)函数 将hello作为参数传给func 此时func == hello
第二步:执行 return wrapper 此时 hello == wrapper
第三步:执行 s = int(input("请输入执行时长>>>")) 手动改输入时长
第四步:执行hello(s) 立即调用hello(s) 也就是调用wrapper(s)
第五步:执行 start = time.time()
第六步:执行 func(s) 也就是调用hell0(s)
第七步:执行sleep(s)
第八步:执行end = time.time()
第九步:执行 total_time = end - start
第十步:返回 计算结果给hello()
第十步:执行 print(hello(s)
"""
中间件,进入视图前做判断是否登录
lg=False
def register():
global lg
if lg:
print('您已注册!请登录!')
else:
usename=input('请输入用户名:')
password=input('请输入登录密码:')
print('注册成功!请登录!')
lg=True
login()
def login():
if lg:
usename = input('请输入用户名:')
password = input('请输入登录密码:')
print('登录成功!')
shopping()
else:
print('您没注册!请去注册!')
register()
def decorate(f):
def inner():
if lg:
f()
else:
print('您还没有登录呢!请登录!')
login()
return inner
@decorate
def shopping():
print('成功进入shopping页面!!!')
@decorate
def reading():
print('成功进入reading页面!!!')
@decorate
def play_game():
print('成功进入play_game页面!!!')
shopping()
reading()
play_game()