装饰器的定义
把一个函数当作参数,返回一个替代版的函数
本质上就是一个返回函数的函数
在不改变原函数的基础上,给函数增加功能
def outer(func):
def inner(age):
if age<0:
age = 0
func(age)
return inner
@outer # 语法糖,相当于 say = outer(say)
def say(age):
print('man is %s years old' %age)
# say = outer(say)
say(-1)
装饰器的应用
多个函数使用一个装饰器
def desc(fun): # 需要传递一个函数,要装饰的函数
def add_info(): # 装饰器函数里要嵌套函数
print('元旦快乐~')
fun() # 执行装饰函数里面的函数对象
print('欢迎光临西部开源~')
return add_info # 返回值是嵌套的函数对象
@desc # 如何调用装饰器(两种方式)
def login():
print('login....')
# login = desc(login) # 返回值是一个函数
# login()
@desc
def logout():
print('logout...')
@desc
def savemoney():
print('存钱...')
@desc
def transfermoney():
print('转账...')
login()
logout()
savemoney()
transfermoney()
装饰器实现一个计时器
import time
import string
import random
import functools
li = [random.choice(string.ascii_letters) for i in range(10)]
# 问题1:装饰的函数有返回值
# 问题2:如何保留被装饰函数的函数名和帮助信息文档
def timeit(fun):
"""这是一个装饰器timeit"""
@functools.wraps(fun) # 可以保留被装饰函数的函数名和帮助信息文档
def add_time(*args, **kwargs): # 接收可变参数和关键字参数
"""这是一个add_time函数"""
# 在函数执行之前计时
start_time = time.time()
# 执行函数
# 函数有返回值时,将函数赋给res
res &