python中的装饰器的理解与实例

本文深入探讨Python装饰器的概念,通过实例解析装饰器如何增强原有函数功能,包括不使用@符号的装饰方式和使用@的简洁形式。并展示了装饰器的多次使用及其等价表达,帮助读者理解装饰器的本质和用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考博客https://blog.youkuaiyun.com/star714/article/details/71045305

               https://www.jianshu.com/p/7a644520418b

装饰器的理解

        简单的理解就是:装饰原有的函数。什么意思呢?比如有一个函数func(a, b),它的功能是求a,b的差值,我现在有一个需求,就是想对函数功能再装饰下,求完差值后再取绝对值,但是不能在func函数内部实现,这时候就需要装饰器函数了,比如func = decorate(func)函数,将func函数作为参数传递给decorate函数,由decorate来丰富func函数,丰富完成后再返回给func,此时func的功能就丰富了。

注意:设计模式中也有装饰器模式

例1:理解装饰器

def sub(a, b):
    return a+b
print(sub(-1,-4))

这是原来的函数,经过装饰后为,

第一种装饰的方式为:(不使用@)

def decorate(func):
    def inner(a, b):
        ret = func(a, b)
        return abs(ret)
    return inner
def sub(a, b):
    return a+b
#对sub函数进行装饰
sub=decorate(sub)
print(sub(-1, -4))

p 第二种装饰的方式(使用@)

def decorate(func):
    def inner(a, b):
        ret = func(a, b)
        return abs(ret)
    return inner
@decorate
def sub(a, b):
    return a+b
sub(-5,-10)

经过装饰后的结果一定为正,本质上将sub=decorate(sub)替换成@decorate,并且放置到所要修饰的函数之前。

通过这个例子,对装饰的本质和写法有了一定的了解。

第二个例子:

def spamrun(fn):
#*args可以接受序列的输入参数。当函数的参数不确定时,可以使用*args。
    def sayspam(*args):
        print("经过修饰")
        fn(*args)
    return sayspam
@spamrun
def useful(a,b,c):
    print(a*b*c)
useful(-2,5,3)

很明显,这个例子的useful函数要经过spamrun装饰器装饰

输出结果为

形象的理解两种实现方式:

             

                       等价于

 

 

结果:

第三个例子:多次使用

依次使用装饰器@spamrun1@spamrun2

       

                     等价于

 

结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值