Python3装饰器速讲

定义:

装饰器是嵌套函数的简短形式,通过装饰器可以修改函数的行为。

基础知识:

1.Python可嵌套定义函数

2.Python的函数名也是变量

3.Python的可变参数*args与**kargs

注意:虽然定义中装饰器是改变函数行为,但其实上其并不能改变函数行为,只能额外增加逻辑。接下来将会逐渐解析这一行为。

# 首先定义一个需要用来装饰的函数,此函数为功能函数
def add(a:int, b:int):
    return a+b


# 再定义一个装饰器函数,用来装饰上面的功能函数 add
def decoration(methodName):
    # 使用函数内可以定义函数的特性,定义一个包裹功能函数的函数
    def wrapTheFunction(*args,**kwargs):
        print("现在要开始计算了哦")
        result = methodName(*args,**kwargs)
        print("计算完毕")
        return result
    return wrapTheFunction


# 此时经过装饰的函数的使用方式变成这样
result = decoration(add)(3,5)
print(result)

# 打印结果如下
# 现在要开始计算了哦
# 计算完毕
# 8

也许有小伙伴现在是满脸问号,第一次见到连续使用两次括号的。没关系,我也才第二次(笑)。先别慌,本质上也只是在调用函数而已,将之拆成两步会很好理解。

# 首先得到执行函数。根据上方定义的函数,返回值其实是一个名为wrapTheFunction的函数。
func = decoration(add)
# 然后开始计算结果。wrapTheFunction中调用了我们定义的功能函数add,并且将参数传给了add
resulut = fun(3,5)

此时大概就已经豁然开朗了。但连续使用两次括号怎么看都会有点奇怪。于是我们来讲讲Python3提供的语法糖。

# 首先定义一个装饰器函数
def decoration(methodName):
    # 使用函数内可以定义函数的特性,定义一个包裹功能函数的函数
    def wrapTheFunction(*args,**kwargs):
        print("现在要开始计算了哦")
        result = methodName(*args,**kwargs)
        print("计算完毕")
        return result
    return wrapTheFunction


# 然后在定义功能函数的时候如此使用
@ decoration
def add(a:int, b:int):
    return a+b


# 此时经过装饰的函数的使用方式变成这样
result = add(3,5)
print(result)

# 打印结果如下
# 现在要开始计算了哦
# 计算完毕
# 8

这里我们会发现两个细节:1.函数只需要调用一次了  2.函数名变成了函数本身

这就是Python3的语法带来的便捷性,如果我们要实现相同的功能,代码需要这样写。

# 导入一个Python3官方提供的装饰器 wraps
from functools import wraps

# 首先定义一个需要用来装饰的函数,此函数为功能函数
def add(a:int, b:int):
    return a+b


# 再定义一个装饰器函数,用来装饰上面的功能函数 add
def decoration(methodName):
    # 使用 wraps 装饰器将 wrapTheFunction 信息修改成传入函数的信息
    @ wraps(methodName)
    def wrapTheFunction(*args,**kwargs):
        print("现在要开始计算了哦")
        result = methodName(*args,**kwargs)
        print("计算完毕")
        return result
    return wrapTheFunction


# 使用 add 变量存储返回的函数 wrapTheFunction,伪装成 add 函数本身
add = decoration(add)
# 再将参数传入伪装后的 add 函数得到结果
result = add(3,5)
print(result)

# 打印结果如下
# 现在要开始计算了哦
# 计算完毕
# 8

Python3 的语法糖帮助我们做的就是如此。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值