Python装饰器

Python装饰器

装饰器

装饰器是为了从已经存在的函数体上添加新功能,但是不对原函数体做修改

  1. 函数能够作为参数传给另一个函数
  2. 函数A还可以将函数B作为其返回值
# 案例一:
def func1(a,b):
    print('[函数func1]正在执行')
    return a + b

def func2(func,c,d):
    print('[函数func2]正在执行')
    return func(c, d)

# 分别调用函数
print(func1(1,2))
print(func2(func1, 1, 2))

# 案例2:
def func3(a,b):
    print('func3正在执行')
    def func4():
        print('func4正在执行')
        return a + b
    print(func4())

func3(10,20)

# 案例3:
def A(a,b):
    print('函数A正在执行')
    def B(c):
        print('函数B正在执行')
        return a + b + c
    return B


B = A(10, 20)
print(B)
print(B(20))

无参装饰器

# 在一个已经实现1-100的求和功能的函数上,外加功能进行性能测试。
import time


# 测试函数
def inner(func):
    def outer(*args, **kwargs):
        start1 = time.time()
        result = func(*args, **kwargs)
        end1 = time.time()
        print(f'程序执行花费{end1 - start1}秒')
        return result

    print(outer)
    return outer


# 功能函数
def numSum(start, end):
    total = 0
    for i in range(start, end + 1):
        total += i
    return total
numSum = inner(numSum)  
# 函数numSum等于变量numSum传递给形参func,inner执行,先打印outer变量代表的函数,再将outer函数返回,重新给numSum赋值
print(numSum) # 打印numSum,等价于打印outer
print(numSum(1, 100))# 调用numSum等于调用outer变量等于调用outer函数

传参1和100,因为装饰器是具有通用性的,所以一个装饰器可以借用给任何函数,所有的函数传参不一定一致,所以使用不定长参数*args和**kwargs接受参数。
在outer函数内部有调用了func函数,func函数就是一开始的numSum,将传递的所有参数(*args,**kwargs)再传递给func函数,此时才开始真正的调用功能函数numSum
最终既能得到功能函数应该得到的结果,有能够测试成功功能函数的性能。

可以将测试函数inner写为语法糖的形式:@测试函数名

# 功能函数
@inner
def numSum1(start, end):
    total = 0
    for i in range(start, end + 1):
        total += i
    return total


print(numSum1(1, 500))

打断点

能够让程序在断点所在位置停止

Debug操作:

step over:一步执行完一个函数体
step into:进入函数体,一步步执行
step into my code:进入自定义函数体,一步步执行
step out:退出并执行完当前函数体
run to cursar:运行到下一个断点

有参装饰器

# 可以在函数体执行功能时在多做验证(web权限验证)
def limit(kind):
    def inner(func):
        def outer(*args,**kwargs):
            result = func(*args,**kwargs)
            if result == '登录成功':
                if kind == '会员':
                    return result,'max_vip'
                else:
                    return result,'白嫖者'
            else:
                return result
        return outer
    return inner


# 语法糖的参数是登录账号时程序同时验证账号权限得到的结果
@limit('会员')
def userLogin(username, pwd):
    if username == 'admin' and pwd == '12345':
        return '登录成功'
    else:
        return '登录失败'


print(userLogin('admin', '12345'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值