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

写在之前

在昨天的文章中(

零基础学习 Python 之闭包

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

装饰器

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

deffirst(fun):

defsecond():

print('start')

fun()

print('end')

printfun.__name__

returnsecond

defman():

print('i am a man()')

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

f=first(man)

f()

结果如下:

start

i am a man()

end

man

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

deffirst(fun):

defsecond():

print('start')

fun()

print('end')

print(fun.__name__)

returnsecond

@first

defman():

print('i am a man()')

man()

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

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

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

start

i am a man()

end

man

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

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

写在之后

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

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

期待和你的交流

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180809A09FTF00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券