为了账号安全,请及时绑定邮箱和手机立即绑定

有人帮我分析一下装饰器吗?

from functools import reduce


def log(f):

    def fn(x):

        print ('call '+ f.__name__ + '()...')

        return f(x)

    return fn

@log

def factorial(n):

    return reduce(lambda x,y: x*y, range(1, n+1))

print (factorial(10))

小白一个,本来函数就懵懵懂懂,看到装饰器更懵了,为什么Log里的return 值我都看不懂。。。

正在回答

2 回答

所谓装饰器,你可以理解为:在保持原函数factorial(n)内部程序不变的基础上,给他增加一行代码 print ('call '+ f.__name__ + '()...'),得到一个新函数,而现在我们又把这个新函数也命名为factorial(n)。于是我们可以看作是factorial()的功能增强了(原函数只能计算阶乘,新函数不仅可以计算阶乘还能打印出函数名称),也就是可以看成是原函数factorial(n)被装饰了一下,加了一行输出代码,所以叫做装饰器。

大家在学这个装饰器的时可以先忽略掉@Log这个标志,因为@Log其实就相当于:factorial=Log(factorial)这行代码(代码位置再调整到factorial()函数的后面)。所以,使用@Log这种标志只是将代码减少了自己字母,大家不要被这个@符号蒙蔽了。你就把它看作是一行正常的factorial=Log(factorial)代码,并放到最后一个print前面就行。

15 回复 有任何疑惑可以回复我~
#1

慕仔8323353 提问者

谢谢,有点清晰了
2018-10-25 回复 有任何疑惑可以回复我~

小白一个,本来函数就懵懵懂懂,看到装饰器更懵了,同感 +1

5 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

有人帮我分析一下装饰器吗?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信