Python基础:装饰器简述

装饰器

作用:向原本的函数添加功能,但是不改变原函数的内部结构

在代码运行期间,可以动态增加函数功能的方式,被称为装饰器【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

来自于个人简单的理解经验,希望对你的学习有帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值