装饰器
顾名思义,从字面意思就可以理解,它是用来”装饰”Python的工具,使得代码更具有Python简洁的风格。换句话说,它是一种函数的函数,因为装饰器传入的参数就是一个函数,然后通过实现各种功能来对这个函数的功能进行增强。
注:装饰器输入一个函数,输出一个函数
装饰器最大的优势是用于解决重复性的操作,其主要使用的场景有如下几个:
1.计算函数运行时间
2.给函数打日志
3.类型检查
当然,如果遇到其他重复操作的场景也可以类比使用装饰器。
# 1.原始需求
def worker1():
print('我是一个勤劳的工作者!')
def worker2():
print('我是一个勤劳的工作者!')
def worker3():
print('我是一个勤劳的工作者!')
# 2.我现在想要打印一些日志信息
def worker1():
print('worker1 is working...')
print('我是一个勤劳的工作者!')
worker1()
# 3.装饰器输入一个函数,输出一个函数
def print_working(func):
def wrapper():
print(f'{func.__name__} is working...')
func()
return wrapper
def worker1():
print('我是一个勤劳的工作者!')
def worker2():
print('我是一个勤劳的工作者!')
def worker3():
print('我是一个勤劳的工作者!')
worker1 = print_working(worker1)
worker1()
worker2= print_working(worker2)
worker2()
# 4.装饰器
@print_working
def worker1():
print('我是一个勤劳的工作者!')
@print_working
def worker2():
print('我是一个勤劳的工作者!')
@print_working
def worker3():
print('我是一个勤劳的工作者!')
worker1()
worker2()
worker3()
# 5.装饰器示例
def arg_decorator(func):
def wrapper(*args, **kw):
print(f'{func.__name__} is working...')
func(*args, **kw)
return wrapper
# 带参数的装饰器
@arg_decorator
def student_info(name, age=18, *books, **kw):
print(f'我的名字叫{name}, 今年{age}岁,我有很多本书:')
for book in books:
print(book)
print(kw)
student_info('Molly',18, '语文书','数学书',height=170)