持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
在代码编写过程当中,从结构上我们最求最简洁,灵活,可以复用,维护成本低,所以有了很多类似套路的代码格式,Python同样有类似的东西,今天要聊的装饰器就是是一种提升代码灵活性的东西。
首先要明白装饰器的作用,装饰器可以在不修改函数功能的前提下给函数添加新的功能,比如:
每个人都要做自我介绍,每个自我介绍都是不同的,所以我们可以把各个自我介绍看成独立的函数,但是,每个自我介绍的开头都需要有统一的赞助商介绍,那么,我们就可以将赞助商介绍部分写到单独的函数当中,作为装饰器,装饰其他的介绍函数。
话不多说,开始层层递进。
函数定义和调用
学习装饰器,首先还是要强调一下函数本身和函数调用:
1)函数名称代表的是函数的名称。
2)函数名称后面加括号代表的是调用函数的功能。
这里必须刻意的注意,每次调用和编写都需要想明白,你需要的是函数还是函数的功能。
函数嵌套
学习函数的时候一直使用的是最基本的函数结果,但是有没有想过在函数当中嵌套一个函数呢:
def outer():
def inner():
print("this is inner")
单独看这个函数的嵌套并没有太大的意义,但是是闭包,惰性函数,装饰器的基础。
闭包
上面所说的函数嵌套最大的问题是在函数当中定义的那个函数意义不大,因为函数没有办法调用,函数不能调用意义也就不大了,所以就需要在外层函数将内层函数返回出来,这就是闭包。
def outer(start,end):
def inner():
obj = [...]
return obj[start,end]
return inner
outer(1,2)()
这个案例是可以体现出闭包的特色,我们研究一些他的使用过程:
1)outer(1,10) 调用outer函数,并且表明想要截取数据的第一到第十位。
2)注意,outer(1,10)返回的并不是具体的数据,而是inner函数,这就是惰性。
3)然后在outer(1,10)后面添加一组括号,相当与调用outer(1,10)返回的函数的功能
大家仔细品品。
函数装饰器
闭包其实已经实现了装饰器的核心功能,但是不够pythonic,嘿嘿嘿,所以有了一种魔术写法:
def outer(fun):
print("感谢xx公司的赞助")
def inner():
fun() #这里要注意fun是一个传递进行的参数,但是参数的值不是数字,字符串,而是函数,所以可以被调用
return inner
@outer #这里相当于introduce = outer(introduce)
def introduce():
print("大家好,我是老张")
introduce() #这里的introduce其实已经是outer返回的inner函数了
#得到结果
感谢xx公司的赞助
大家好,我是老张
这就是函数装饰器,上面的写法在初学的时候可以作为一种固定的套路,@outer是装饰器的写法,会将@outer下面挨着的函数作为参数传递到outer函数当中。
Python函数装饰器基础我们就讲到这里了,后面的爬虫案例当中用到了我们接着分享。