函数装饰器

文章介绍了Python中的函数装饰器原理,包括如何使用函数装饰其他函数,装饰器的执行过程,以及如何处理装饰带有参数的函数。装饰器可以通过嵌套函数或使用*args和**kwargs来适应不同参数个数的函数。此外,文章还提到了装饰器的嵌套使用和其等效的代码表示。
摘要由CSDN通过智能技术生成

函数装饰器原理演示:

# funnA作为函数装饰器
def funA(fn):
    # ...
    fn() # 执行传入的fn参数
    # ...
    return "..."

@funA
def funB():
    # ...

以上程序完全等价于:

def funA(fn):
    # ...
    fn() # 执行传入的fn参数
    # ...
    return "..."

def funB():
    # ...

B= funA(funB)

通过以上两段程序发现,通过函数funA去装饰函数funB,执行了两个步骤:
1、将函数funB作为参数传给funA
2、将函数funA执行完成的返回值反馈给funB,通过打印函数输出

实例:

# funnA作为函数装饰器
def funA(fn):
    print("helloA")
    fn() # 执行传入的fn参数
    return "装饰器返回的结果"

@funA
def funB():
    print("helloB")

输出:
helloA
helloB

添加如下代码:

print(funB)
输出:装饰器返回的结果

被装饰的函数不再是原来的函数,这取决于装饰器返回的值,如果装饰器返回的是普通变量,那么被装饰的函数名就成为变量名,可以通过打印函数名获得装饰器返回值;如果装饰器返回的是一个函数名称,那么被装饰的函数依然是一个函数

带参数的函数装饰器:
如果被装饰的函数有参数时,该怎么作为值传给装饰器

# 比较简单的方法就是装饰器中嵌套一个函数,该函数带的参数的个数和被装饰的函数相同
def funA(fn):
    # 定义一个嵌套函数
    def say(name):
        print("名字叫:",name)
    return say

@funA
def funB(name):
    print("funB")

funB("张三")

 # 通过装饰器funB被赋值为say,虽然是显式的调用funB函数,但实际是执行say()函数

如果有多个函数被不同装饰器修饰,而这些函数的参数个数又不想等,那么可以用*args 和 **kwargs 作为装饰器内部嵌套函数的参数

def funA(fn):
    def say(*args,**kwargs):
        # 执行被装饰的函数
        fn(*args,**kwargs)
    return say

@funA
def funB(name):
    print("我的名字:",name)
    
@funA
def funC(name,age):
    print("你的名字和年龄:",name,age)

funB("张三")
funC("李四",22)

装饰器可以嵌套:

@funA
@funB
@funC
def fun():
    #...

# 上面程序的执行顺序是里到外,所以它等效于下面这行代码:
fun = funA( funB ( funC (fun) ) )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值