前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >零基础学习 Python 之装饰器才露尖尖角

零基础学习 Python 之装饰器才露尖尖角

作者头像
编程文青李狗蛋
发布2019-11-07 15:36:55
2220
发布2019-11-07 15:36:55
举报
文章被收录于专栏:编程文青李狗蛋
写在之前

在昨天的文章中(零基础学习 Python 之闭包)学习了闭包的概念,今天我们要讲的装饰器,本质上也是闭包的一种应用,所以如果你没有看过昨天的文章,建议在看下面的内容之前回头去看一下闭包。

装饰器

我们到现在已经知道,函数是对象,可以被传递,也能被嵌套。下面我们先来看一个很常见的小例子:

代码语言:javascript
复制
def first(fun):
    def second():
        print('start')
        fun()
        print('end')
        print fun.__name__
    return second

def man():
    print('i am a man()')

上述的例子中,first() 函数的参数是一个函数,如果我们用下面的方式来调用此函数:

代码语言:javascript
复制
f = first(man)

f()

结果如下:

代码语言:javascript
复制
start
i am a man()
end
man

这个就是向 first() 传递了函数对象 man()。对于这么一个问题,可以换成下面这种写法:

代码语言:javascript
复制
def first(fun):
    def second():
        print('start')
        fun()
        print('end')
        print (fun.__name__)
    return second

@first
def man():
    print('i am a man()')

man()

你如果对比之前的那段代码,你会发现这里面多了个奇怪的 @first,我们常常把类似的这种东西叫做语法糖,也叫糖衣语法,至于为什么。。可能是因为发明这个术语的人喜欢吃糖???(抖个机灵

维基百科中关于语法糖的解释是这样的:指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说,使用语法糖可以增加程序的可读性,从而减少程序代码出错的机会。

上面那段解释看看就好,我们用语法糖这种方式执行上面的代码的结果如下:

代码语言:javascript
复制
start
i am a man()
end
man

你会发现这种方式的结果和之前的结果一模一样,以上就是所谓的装饰器及其应用,first() 是装饰器函数,使用 @first 来装饰 man() 函数。

如果你看到这,你就会发现其实装饰器本质上就是一个函数,它把一个函数当做输入并且返回给另外的一个函数,就如上面所演示的一样。当然不只是函数可以作为输入,被装饰的类也是可以的,至于什么是类,使我们下个章节要学习的内容,如果感兴趣的话,可以提前看一看。

写在之后

这篇文章实际上只是介绍了装饰器的概念性的东西,关于装饰器,因为上面我说了,除了函数,被装饰的类也是可以的,因为还没有到类的部分,所以在这里只是浅尝辄止,等后面学类的时候,会把这部分再深入细致的探索下去,把这部分的坑给填上,敬请期待。

如果对之前学过的内容,哪部分还有疑问,或者哪部分觉得还缺什么,欢迎通过微信联系我,我会看情况再做细致的解释,谢谢了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python空间 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档