前言
装饰器在python中随处可见,是Python的语法糖,用处也是大大滴。当然,面试python相关的岗位,这也是一个必备的面试题。如果只会使用,而不了解其中的原理,面试也是会被虐的。
记得有一个面试,面试官问我「装饰器是什么?」。我没思考过这个问题,只会说相当于java的面向切片编程,对函数前面或者后面做一层包装。而面试官对我这个答案不满意,只是重复这个问题。结果是显而易见的,我没面上这个公司。后来反思了这个问题,觉得这个知识点我算是比较熟悉的,而且他想要的答案我知道啊。然后我就把锅甩给了面试官,不会引导面试者,自己预设一个问题,然后预设一个回答,回答和他预设的答案不一致就拜拜。
装饰器是函数
此节标题算是对于那个面试官的回答,装饰器本质上就是函数。只不过python中把这个特性做成了语法糖。让一个看起来可能有点愚笨的操作,变得比较优雅。
def make_bold(func):
def wrapper():
return "<b>%s</b>" % func()
return wrapper
def get_content():
return 'content'
get_content = make_bold(get_content)
print get_content()
不知道装饰器,上面的代码也是可以看出结果的,如下
<b>content</b>
make_bold函数的作用,就是给传入的函数返回值做一层包装,外侧嵌套一层<b></b>。
通过装饰器来实现的话,代码如下
@make_bold
def get_bold_content():
return 'content'
print get_bold_content()
装饰器简化了赋值的操作,通过@decorator直接放到了需要修饰的函数之上,非常的优雅、简介、达意。把两部分分开的、本来应该关联在一起的代码,通过语法糖的方式放到了一起,真的是非常优美!
带参数的装饰器
如果想要给装饰器传入参数的话,那应该怎么办呢?方案是给装饰函数,再嵌套一层。如下
def make_header(level):
def decorator(func):
def wrapper():
return "<h{0}>{1}</h{0}>".format(level, func())
return wrapper
return decorator
这样就可以使用参数,来随心的给不同函数分别设置不同的<h>等级了。
@make_header(1)
def get_header_content():
return "content"
print get_header_content()
结语
本文项目地址https://github.com/dahaihu/records/tree/master/decorator,觉得还不错的话,可以给个star啊!
其实这段话也可以写成一个装饰器,给写的每个文章后面都添加一下相似的结语。需要使用可以传参数的装饰器,因为每个文章的项目地址不一致。是不是觉得用处很大?