装饰器
作用:向原本的函数添加功能,但是不改变原函数的内部结构
在代码运行期间,可以动态增加函数功能的方式,被称为装饰器【Decorator】
也就是说,在不修改原函数的基础上,给原函数增加功能
好处:在团队开发中,如果两个或者两个以上的程序员会用到相同的功能,但是功能又有细微的差别,采用装饰器:相互不影响,代码简化
简单装饰器
# 简单装饰器
def out(f):
def inner():
print('先跳个舞')
f()
print('先唱个歌')
return inner
def sleep():
print('睡觉')
# 使用装饰器
print('装了装饰器之前', sleep.__name__) # 装了装饰器之前
sleep()
print()
# 先把函数sleep作为参数传递,再将inner函数返回给sleep,sleep = inner
sleep = out(sleep)
print('装了装饰器后', sleep.__name__) # 装了装饰器后
sleep() # 相当于 inner()
print('-'*50)
import time
def out2(f):
def inner():
s = time.time()
f()
e = time.time()
# time用来计时函数执行所用的时间
print(e - s)
return inner
# 先去调用函数out2,将函数inner返回给函数game, 相当于函数game => out2(game),而原本的函数game已作为参数传递给装饰器函数。
@out2
def game():
print('开始玩游戏……')
print('玩王者荣耀……')
time.sleep(1)
print('玩和平精英……')
time.sleep(2)
@out2
def game2():
print('开始玩游戏……')
print('玩王者荣耀……')
time.sleep(1)
print('玩和平精英……')
time.sleep(2)
# 使用装饰器向函数game添加功能
# game = out2(game) => @out2
# game2 = out2(game2) => @out2
game()
game2()
```python
通用装饰器
def outer(f): # eat => f
def inner(*args, **kwargs):
print('before')
f(*args, **kwargs) # f(s) => eat(food)
print('after')
return inner
# 先调用outer函数,返回inner函数 eat = outer(eat) => inner
@outer
def eat(food):
print('吃饭:', food)
'''
# 如果装饰器的参数也是和eat的参数数量一样的话,这个eat2会报错,参数数量不一样,所以触发器中inner函数要用*args, *kwargs来接收不同数量的参数
'''
@outer # eat = outer(eat) => inner
def eat2(food, food2):
print('吃饭:', food, food2)
eat('鸭腿')
eat2('鸡腿', '鸭腿')
装饰多个装饰器
多个装饰器作用于同一个函数的时候,从第一个装饰器开始,从上往下依次执行,但是,原函数只会被执行一次
def outer3(f):
def inner(*args, **kwargs):
print('before 3')
f(*args, **kwargs)
print('after 3')
return inner
def outer4(f):
def inner(*args, **kwargs):
print('before 4')
f(*args, **kwargs)
print('after 4')
return inner
@outer3
@outer4
def dance():
print('跳舞')
dance() # 原dance()只会执行一次
# 离这个dance函数越近的装饰器在最内层输出,原函数只会被执行一次
# before 3
# before 4
# 跳舞
# after 4
# after 3
来自于个人简单的理解经验,希望对你的学习有帮助!