python装饰器

装饰器

定义
  1. 装饰器函数 实质 就是 闭包函数
  2. 装饰器使用@装饰器函数名进行装饰
# 1. 定义装饰器函数
def outer(func):
    def inner():
     
        print("开始新功能")
        func()
        print("结束新功能")

    return inner


@outer   # 2. 装饰器
def add():  #3.被装饰函数
    print("两数之和是3")

    
add() 
装饰过程:
  • @outer ====> add = outer(add),也就是 装饰器装饰完 函数之后, 将outer()函数返回值重新赋值给变量 add
  • 最新的add函数指向 内层函数inner
  • 而此时outer 函数中的func才是原来的 add函数
执行过程:
  • add(),函数的执行过程, 实际执行的是inner(), 而在inner函数中的 func才是原来的add函数

在装饰过程中,离函数近的装饰器先装饰
在装饰执行中,离函数远的装饰器先执行
多个装饰器;装饰顺序和执行顺序相反

被装饰函数有参数
def outer(func):
    def inner(x, y):
        func(x, y)  # 新版的 func  才是 原来的 add

    return inner


@outer
def add(x, y):
    print(x + y)


add(1, 2)  # 新版的 add  是 内层 inner

# add(1, 2)   ====>  inner(1, 2)  ====>  func(1, 2)  ===> 3

被装饰函数 有参数,innerfunc需要同样的参数

被装饰函数有返回值
def outer(func):
    def inner(x, y):

        r = func(x, y)  # 装饰器装饰之后,func是真正的add求和函数
        r += 10  # 将两数之和再加 10
        
        return r

    return inner


@outer
def add(x, y):
    return x + y


# 在装饰器中 对函数的执行结果 加10 处理
r = add(10, 200)  # add实际是inner
print(r)

被装饰函数有返回值, inner需要将 func 的结果 返回

示例

装饰器模拟判断用户是否登录

# 1,定义装饰器函数
def login(func):
    def inner():
        a = '已登录'  # 模拟用户是否登录的标识
        if a == "已登录":
            func()
        else:
            print("请登录")

    return inner

# 2. 装饰器 装饰原函数
@login
def userinfo():
    print("欢迎来到 用户中心")

# 3. 调用被装饰后的函数
userinfo()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值