python 基础——装饰器
2016-08-13 16:29
253 查看
python 的装饰器,其实用到了以下几个语言特点:
1. 一切皆对象
2. 函数可以嵌套定义
3. 闭包,可以延长变量作用域
4. *args 和 **kwargs 可变参数
第1点,一切皆对象,包括函数。函数也是个对象,所以函数这个对象可以和其他任何对象一样被赋值给其它变量,包括作为实数传递给函数。
第2点,在函数中可以再定义一个函数,并且,结合第1点,函数是个对象,那么嵌套定义的函数,还可以被作为函数执行结果返回,也就是 return object。
第3点,类似 JS 的特性,就是在嵌套定义的函数销毁前,其外层函数的函数作用域一直存在。
第4点,则是为了处理参数上的方便。
1. 一切皆对象
2. 函数可以嵌套定义
3. 闭包,可以延长变量作用域
4. *args 和 **kwargs 可变参数
第1点,一切皆对象,包括函数。函数也是个对象,所以函数这个对象可以和其他任何对象一样被赋值给其它变量,包括作为实数传递给函数。
第2点,在函数中可以再定义一个函数,并且,结合第1点,函数是个对象,那么嵌套定义的函数,还可以被作为函数执行结果返回,也就是 return object。
第3点,类似 JS 的特性,就是在嵌套定义的函数销毁前,其外层函数的函数作用域一直存在。
第4点,则是为了处理参数上的方便。
普通装饰器
def decorator(func): outer = '外层函数作用域定义的局部变量' def inner(*args, **kwargs): print outer print args print kwargs return inner @decorator def func(*args, **kwargs): print 'hello world' # 以上装饰器作用等价于: new_func = decorator(func) func(1, 2, 3, a='one', b='two') new_func(1, 2, 3, a='one', b='two') # 外层函数作用域定义的局部变量 # (1, 2, 3) # {'a': 'one', 'b': 'two'} # 外层函数作用域定义的局部变量 # (1, 2, 3) # {'a': 'one', 'b': 'two'}
带参数的装饰器
带参数的装饰器,其实是相当于又多了一层嵌套定义,装饰器函数返回的也是一个装饰器函数。def decorator(info): def really_dec(func): outer = info def inner(*args, **kwargs): print outer print args print kwargs return inner return really_dec @decorator('我是装饰器参数') def func(*args, **kwargs): print 'hello world' func(1, 2, 3, a='one', b='two') # 我是装饰器参数 # (1, 2, 3) # {'a': 'one', 'b': 'two'}
相关文章推荐
- 【Python基础】装饰器的解释和用法
- Python基础语法(3)——文件流、异常处理、面向对象编程以及装饰器
- python学习系列之python装饰器基础(5)---多装饰器的使用
- Python基础-迭代器&生成器&装饰器
- python基础——装饰器
- python_fullstack基础(七)-装饰器
- python学习系列之python装饰器基础(3)---装饰器实现用户登录验证
- python基础—(高阶,匿名,偏)函数 | 装饰器
- python基础之:九步认识装饰器
- Python 基础 —— 装饰器(2)
- python基础(06)——装饰器
- Python基础-装饰器
- Python基础-装饰器
- python基础-装饰器进阶
- Python——装饰器基础
- python基础——装饰器
- python基础——装饰器
- Python 基础 —— 装饰器(1)
- Python基础-装饰器
- Python基础(七) python自带的三个装饰器