理解python中的装饰器
2018-01-04 07:39
246 查看
装饰器可以改变目标函数的行为,而不用更改目标函数本身,可以扩展原来函数的行为。
- 函数可以赋给变量
- 在函数中定义其他函数
- 函数可以作为参数传递
- 函数可以作为其他函数的返回值
- 内层函数可以获取闭包(closure)中的数据
现在我们来给目标函数再加两个装饰器,加上
如果不用python提供的简介语法,我们需要这样写:
但是有了python装饰器语法,表达式就变得好看多了:
注:装饰器是有顺序的,顺序不同会产生不同的结果
可以给wrapper传入 args and *kwargs作为参数,这样它就可以接受任意数目的参数了:
参考资料:
https://www.thecodeship.com/patterns/guide-to-python-function-decorators/
1. 在说明什么是装饰器之前,先要理解python中的函数
Python中的函数是一等公民:- 函数可以赋给变量
- 在函数中定义其他函数
- 函数可以作为参数传递
- 函数可以作为其他函数的返回值
- 内层函数可以获取闭包(closure)中的数据
2. 装饰器的组成
函数装饰器就是将函数包起来的包装纸def get_text(name): return "lorem ipsum, {0} dolor sit amet".format(name) def p_decorate(func): def func_wrapper(name): return "<p>{0}</p>".format(func(name)) return func_wrapper my_get_text = p_decorate(get_text) print my_get_text("John") # <p>Outputs lorem ipsum, John dolor sit amet</p>
3. Python装饰器的语法
Python提供了以上代码的简洁化语法(syntactic sugar)。我们只需在目标函数之前生命装饰器的名字即可(前面加上@)
def p_decorate(func): def func_wrapper(name): return "<p>{0}</p>".format(func(name)) return func_wrapper @p_decorate def get_text(name): return "lorem ipsum, {0} dolor sit amet".format(name) print get_text("John") # Outputs <p>lorem ipsum, John dolor sit amet</p>
现在我们来给目标函数再加两个装饰器,加上
<div>,
<strong>标签
def p_decorate(func): def func_wrapper(name): return "<p>{0}</p>".format(func(name)) return func_wrapper def strong_decorate(func): def func_wrapper(name): return "<strong>{0}</strong>".format(func(name)) return func_wrapper def div_decorate(func): def func_wrapper(name): return "<div>{0}</div>".format(func(name)) return func_wrapper
如果不用python提供的简介语法,我们需要这样写:
get_text = div_decorate(p_decorate(strong_decorate(get_text)))
但是有了python装饰器语法,表达式就变得好看多了:
@div_decorate @p_decorate @strong_decorate def get_text(name): return "lorem ipsum, {0} dolor sit amet".format(name) print get_text("John") # Outputs <div><p><strong>lorem ipsum, John dolor sit amet</strong></p></div>
注:装饰器是有顺序的,顺序不同会产生不同的结果
可以给wrapper传入 args and *kwargs作为参数,这样它就可以接受任意数目的参数了:
def p_decorate(func): def func_wrapper(*args, **kwargs): return "<p>{0}</p>".format(func(*args, **kwargs)) return func_wrapper class Person(object): def __init__(self): self.name = "John" self.family = "Doe" @p_decorate def get_fullname(self): return self.name+" "+self.family my_person = Person() print my_person.get_fullname()
4. 向装饰器传参
给装饰器再加一层外层函数,用来接受参数并返回装饰器def tags(tag_name): def tags_decorator(func): def func_wrapper(name): return "<{0}>{1}</{0}>".format(tag_name, func(name)) return func_wrapper return tags_decorator @tags("p") def get_text(name): return "Hello "+name print get_text("John") # Outputs <p>Hello John</p>
参考资料:
https://www.thecodeship.com/patterns/guide-to-python-function-decorators/
相关文章推荐
- 对Python中装饰器(Decorator)的理解与进阶
- 个人对python装饰器的理解
- 12步教你理解Python装饰器
- 对Python装饰器的个人理解
- 理解Python 装饰器
- 分层次理解python装饰器
- 深入理解Python装饰器
- python装饰器,一种更容易理解的方式
- 深入浅出理解python 装饰器
- 对Python装饰器的个人理解方法 推荐
- 12步教你理解Python装饰器
- 深入理解Python中装饰器的用法
- [python]理解python中的装饰器
- 如何理解Python装饰器
- Python:装饰器的简单理解
- 理解python装饰器
- 深入理解python装饰器和闭包
- python 装饰器的小理解
- 理解Python中的装饰器
- 简单 12 步理解 Python 装饰器