python 修饰器 参数_Python修饰器

前话:

python的修饰器可以说是python语言最有灵性的一个功能了,看到网上有各种乱乱的文章,所以想自己写得亲民一下,如有错误请指出。

正文:

@fnc & 被修饰函数无参数

首先看一组简单的代码:

#修饰器

def dec(fn):

print("此处fn为函数",fn)

return fn

@dec

#被修饰函数

def my_fn():

return "函数返回值"

print(my_fn())

>>> 此处fn为函数

>>> 函数返回值

以上的代码的修饰过程相当于my_fn => dec(my_fn)

@fnc & 被修饰函数有参数

接下来为被修饰函数加参数:

def dec(fn):

print("此处fn为函数",fn)

return fn

@dec

def my_fn(a):

return "函数返回值为"+str(a)

print(my_fn('参数'))

>>> 此处fn为函数

>>> 函数返回值为参数

此处依然为my_fn => dec(my_fn)

[小插曲]@fnc() & 被修饰函数无/有参数

在修饰器和被修饰函数都带参数前,先准备一个小插曲:

def dec_out():

print('运行了dec_out')

def dec_in (b):

print("运行了dec_in")

return b

return dec_in

@dec_out()

def my_fn(a):

return "函数返回值为"+str(a)

print(my_fn('my_fn参数'))

>>> 运行了dec_out

>>> 运行了dec_in

>>> 函数返回值为my_fn参数

看到这么多函数不要晕哦,我来解释一下:

首先运行my_fn函数时先进入了修饰器

遇到了dec_out时发现修饰器位置是一个被执行的函数(带着括号),于是便执行了一下

修饰器就因为里面的return dec_in就等效成了@dec_out() => @dec_in

因此my_fn('my_fn参数')就等效成了dec_in(my_fn)('my_fn参数')

在这里休息一下,我来解答一下可能存在的疑惑:

Q:为什么上一个情况my_fn => dec(my_fn),这次是dec_in(my_fn)('my_fn参数')

A:注意细节哦,上一个是my_fn,这次是my_fn('my_fn参数')

[正餐]@fnc(*arg) & 被修饰函数无/有参数

到了正餐了,有了上一个的铺垫,这次的也可以理解了

def dec_out(a):

print("dec_out收到了",a)

def dec_in (b):

print("dec_in收到了",b)

return b

return dec_in

@dec_out("修饰器参数")

def my_fn(a):

return "函数返回值为"+str(a)

print(my_fn('my_fn参数'))

>>> dec_out收到了 修饰器参数

>>> dec_in收到了

>>> 函数返回值为my_fn参数

有没有预知到这次的结局呢?某种意义上很清楚明了了:

@dec_out("修饰器参数")在运行的因为return dec_in等效成了@dec_in,进而my_fn('my_fn参数')等效成了dec_in (my_fn)('my_fn参数')

这里我就不人肉DEBUG来给各位讲解了。

[加餐]多重@fnc(*arg) & 被修饰函数无/有参数

一下比较简单:

def dec_first(fn):

print("dec_first运行了")

return fn

def dec_second(fn):

print("dec_second运行了")

return fn

@dec_first

@dec_second

def my_fn():

return "my_fn运行了"

print(my_fn())

>>> dec_second运行了

>>> dec_first运行了

>>> my_fn运行了

从以上可以看出修饰器的运行顺序是从临近被修饰函数开始的。但是不要认为解释器是直接从第二个修饰器开始解释的。

请看一下代码:

def dec_first_out(a):

print("dec_first_out收到了",a)

def dec_first_in(fn):

print("dec_first_in运行了")

return fn

return dec_first_in

def dec_second(fn):

print("dec_second运行了")

return fn

@dec_first_out('第一个参数')

@dec_second

def my_fn():

return "my_fn运行了"

print(my_fn())

>>> dec_first_out收到了 第一个参数

>>> dec_second运行了

>>> dec_first_in运行了

>>> my_fn运行了

由此可以看出,解释器看到了最上方的修饰器处于运行状态(有括号)于是运行,后再按上面咱们发现的行为运行。

[最后的晚餐]被修饰的修饰器

听起来复杂,实际还是这么回事:

def dec_dec(fn):

print("dec_dec运行了")

return fn

@dec_dec

def dec(fn):

print("dec运行了")

return fn

@dec

def my_fn():

return "my_fn运行了"

print(my_fn())

>>> dec_dec运行了

>>> dec运行了

>>> my_fn运行了

看到这里应该已经清楚了吧,最有灵性的功能也是按部就班的执行的。

总结

总的来看,python的修饰器可以这么理解:

如果@后方不是一个函数名称,则运行到为一个函数名称为止,这种情况才会被解释成一个 参数为被修饰函数 的函数调用过程。(这么说是为了通俗明了,实际这么说欠妥)

多层的(闭包)函数作为修饰器要注意最终运行结果为一个函数名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值