理解Python函数装饰器
来源:互联网 发布:手机收银软件免费版 编辑:程序博客网 时间:2024/05/16 10:39
理解Python函数装饰器
Python中的函数装饰器是一种能在不修改函数及函数名的前提下给函数添加额外功能的写法.
我说装饰器是种写法, 是因为装饰器其实并不是什么不同的语法, 而是一种解决某类问题的一种写法. 即使你不知道装饰器, 可能在解决一些问题的时候也写出了装饰器.
问题场景
我们有一个函数:
def func_a(x): print x*x a(2)
现在想在print
前显示时间time.time()
, 最简单的写法是直接加上这一句:
import timedef func_a(x): print time.time() print x*x a(2)
但是我们不想修改func_a
的代码(实际场景可能是这个函数是别人写的, 或者函数逻辑很复杂, 不好直接修改),这时候可以通过其他函数调用来实现:
import timedef func_a(x): print x*x def func_a_plus(x): print time.time() return func_a(x)func_a_plus(2)
这时候有个问题了, 假设其他模块中大量调用了这个func_a
, 我们想在不修改func_a
名称的前提下给它加功能.
不能直接把func_a_plus
赋值给func_a
(会造成循环引用的问题), 可以把函数作为参数传递来实现:
import timedef func_a(x): print x*x def func_a_plus(func): print time.time() return funcfunc_a = func_a_plus(func_a)
解决方法似乎已经变得麻烦起来了. 更麻烦的是, 这种写法其实不符合要求, 因为新函数返回的其实还是未经改变的原函数, time.time()
只在赋值时运行了一次, 之后就不会再运行.
所以, 只能把一个新函数赋值给原函数名, 又不能造成循环引用的问题, 如何实现?
答案是靠Python中的闭包. 在函数内部重新定义一个函数, 将内部嵌套的函数返回给原函数名, 这个函数名就会指向嵌套的函数.
import timedef func_a(x): print x*xdef func_plus(func): def wap(x): print time.time() return func(x) return wapfunc_a = func_plus(func_a)
这个新函数func_plus
就是装饰器了.
语法糖
Python 中有个语法糖可以更方便地写装饰器:
import timedef func_plus(func): def wap(x): print time.time() return func(x) return wap@func_plusdef func_a(x): print x*x@func_plusdef func_b(x): print x*x*x
这种@装饰函数
的写法代替了重新赋值的语句func_a = func_plus(func_a)
, 但实现的功能相同.
阅读全文
0 0
- 理解Python函数装饰器
- 理解Python 返回函数和装饰器
- python装饰器理解
- 理解python装饰器
- python装饰器理解
- python装饰器理解
- 理解Python 装饰器
- 理解Python 装饰器
- 理解Python装饰器
- python 装饰器理解
- Python闭包、函数式编程、装饰器深入理解
- 【装饰器】理解Python中的装饰器
- PYTHON 函数装饰器
- python 函数装饰器
- Python函数:装饰器
- Python 函数装饰器
- python函数装饰器
- python函数装饰器
- bettercap
- pipenv 简要指南
- lxml.html 中几种解析器的区别
- Sentry API 使用笔记
- [Leetcode][求和问题2Sum/3Sum/4Sum/KSum]相关题目汇总/分析/总结
- 理解Python函数装饰器
- Python 的列表推导式
- EA-企业架构
- HPUoj 1409: Watch Dog [最小生成树]
- [ZOJ1654]放置机器人
- HPU 1410: QAQ & 火星情报局 ( 数学
- 1412: QAQ & 君临天下 || 天行九歌 [区间]
- HPUoj 1413: StarFarming [最短路]
- Flatten Binary Tree to Linked List问题及解法