装 饰 器

本文探讨了装饰器的概念,它是可执行函数,接收函数作为参数并增强其功能。通过闭包和@符号的应用,理解如何装饰带参数的函数,并展示了带参数装饰器的实例。重点在于理解装饰器在不改变原有代码基础上扩展功能的方法。

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

一,装饰器概念

装饰器本质上还是函数,让其它的函数在不做任何代码修改的情况下,增加额外的功能

所以说一句话:还是函数,记住奥

谈到一个原则:开发封闭原则

概念: 一个以函数作为参数并返回一个替换函数的可执行函数。。装饰器的本质是一个嵌套函数,外层函数的参数是被执行的函数,内层函数是一个闭包并在其中增加新功能(装饰器的功能函数)

这里又提到了闭包,详细了解看这里:

https://mp.csdn.net/mp_blog/creation/editor/123261172

怎么理解?

一个例子:

def f2(func):
    def f1():
        x = func()
        return x + 1
    return f1
def func():
    print("输出func()函数")
    return 1
dec = f2(func)
print(dec())
print(func())

1.函数f2就是一个闭包,传入另一个函数名作为参数。

2.f1()函数为闭包的功能函数,其中调用了func() 函数并将 func( ) 函数的返回值加 1 并返回。

3.每次 f2( ) 函数被调用时,func 的值可能会不同,但无论 func ( ) 代表的何种函数,程序都将调用它.。

4.调用函数dec 和func 函数都将输出 “ func()函数”,dec 返回值为2,func函数的返回值为1。此时称变量dec 是 func 的装饰版。即在 func( ) 函数的基础上增加新的功能。

你这里可以想,你定义的函数返回值为一个函数名,那么在你定义的函数后面再加一个括号是不是就执行的是你函数返回值的函数名的那个函数即:l例如

def f2(func):
    def f1():
        return func() + 1
    return f1
def func():
    print("输出func()函数")
    return 1
func = f2(func)
print(func())

二.@符号的使用

上边我们使用变量名将装饰器函数与被装饰函数联系起来。还可以通过@符号和装饰器名实现两者的联系。

示例

def f2(func):
    def f1():
        return func() + 1
    return f1
@f2
def func():
    print("输出func()函数")
    return 1

print(func())

通过@符号和装饰器名实现装饰器函数与被装饰函数联系,当调用func()函数时,程序会自动调用装饰器函数的代码

三.有参数函数的装饰

示例:

                 f1()函数中的参数必须包含对应func()函数的参数

def f2(func):
    def f1(a=0, b=0):
        print(a,b)
        return func(a,b) + 1
    return f1
@f2
def func(a=0, b=0):
    print("输出func()函数")
    return a + b
print(func(3,5))

四.带参数的装饰器

因为装饰器也是一个函数,即装饰器本身也可以带参数,此时装饰器需要再多一层的内嵌函数。

第一行先定义装饰器函数,由3个函数嵌套而成,最外层函数有一个装饰器自带的参数,内层函数不变,相当于闭包的嵌套

def f3(arg = '装饰器参数'):
    def f2(func):
        def f1():
            print(arg)
            return func() + 1
        return f1
    return f2
@f3("带参数的装饰器")
def func():
    print("输出func()函数")
    return 1
print(func())

这里的装饰器相当于函数名作为形参传入另一个函数中形成的函数调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值