没有合适的资源?快使用搜索试试~ 我知道了~
装饰器(Decorators) 装饰器是这样一种设计模式:如果一个类希望添加其他类的一些功能,而不希望通过继承或是直接修改源代码实现,那么可以使用装饰器模式。简单来说Python中的装饰器就是指某些函数或其他可调用对象,以函数或类作为可选输入参数,然后返回函数或类的形式。通过这个在Python2.6版本中被新加入的特性可以用来实现装饰器设计模式。 顺便提一句,在继续阅读之前,如果你对Python中的闭包(Closure)概念不清楚,请查看本文结尾后的附录,如果没有闭包的相关概念,很难恰当的理解Python中的装饰器。 在Python中,装饰器被用于用@语法糖修辞的函数或类。现在让我们用一个简单
资源推荐
资源详情
资源评论
详解详解Python中的装饰器、闭包和中的装饰器、闭包和functools的教程的教程
装饰器装饰器(Decorators)
装饰器是这样一种设计模式:如果一个类希望添加其他类的一些功能,而不希望通过继承或是直接修改源代码实现,那么可以
使用装饰器模式。简单来说Python中的装饰器就是指某些函数或其他可调用对象,以函数或类作为可选输入参数,然后返回
函数或类的形式。通过这个在Python2.6版本中被新加入的特性可以用来实现装饰器设计模式。
顺便提一句,在继续阅读之前,如果你对Python中的闭包(Closure)概念不清楚,请查看本文结尾后的附录,如果没有闭包的
相关概念,很难恰当的理解Python中的装饰器。
在Python中,装饰器被用于用@语法糖修辞的函数或类。现在让我们用一个简单的装饰器例子来演示如何做一个函数调用日
志记录器。在这个例子中,装饰器将时间格式作为输入参数,在调用被这个装饰器装饰的函数时打印出函数调用的时间。这个
装饰器当你需要手动比较两个不同算法或实现的效率时很有用。
def logged(time_format):
def decorator(func):
def decorated_func(*args, **kwargs):
print "- Running '%s' on %s " % (
func.__name__,
time.strftime(time_format)
)
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print "- Finished '%s', execution time = %0.3fs " % (
func.__name__,
end_time - start_time
)
return result
decorated_func.__name__ = func.__name__
return decorated_func
return decorator
来看一个例子,在这里add1和add2函数被logged修饰,下面给出了一个输出示例。请注意在这里时间格式参数是存储在被返
回的装饰器函数中(decorated_func)。这就是为什么理解闭包对于理解装饰器来说很重要的原因。同样也请注意返回函数的名
字是如何被替换为原函数名的,以防万一如果它还要被使用到,这是为了防止混淆。Python默认可不会这么做。
@logged("%b %d %Y - %H:%M:%S")
def add1(x, y):
time.sleep(1)
return x + y
@logged("%b %d %Y - %H:%M:%S")
def add2(x, y):
time.sleep(2)
return x + y
print add1(1, 2)
print add2(1, 2)
# Output:
- Running 'add1' on Jul 24 2013 - 13:40:47
- Finished 'add1', execution time = 1.001s
3
- Running 'add2' on Jul 24 2013 - 13:40:48
- Finished 'add2', execution time = 2.001s
3
如果你足够细心,你可能会注意到我们对于返回函数的名字__name__有着特别的处理,但对其他的注入__doc__或是
__module__则没有如此。所以如果,在这个例子中add函数有一个doc字符串的话,它就会被丢弃。那么该如何处理呢?我们
当然可以像处理__name__那样对待所有的字段,不过如果在每个装饰器内都这么做的话未免太繁冗了。这就是为何functools
模块提供了一个名为wraps的装饰器的原因,那正是为了处理这种情况。可能在理解装饰器的过程中会被迷惑,不过当你把装
饰器看成是一个接收函数名作为输入参数并且返回一个函数,这样就很好理解了。我们将在下个例子中使用wraps装饰器而不
是手动去处理__name__或其他属性。
下个例子会有点复杂,我们的任务是将一个函数调用的返回结果缓存一段时间,输入参数决定缓存时间。传递给函数的输入参
数必须是可哈希的对象,因为我们使用包含调用输入参数的tuple作为第一个参数,第二个参数则为一个frozenset对象,它包
资源评论
weixin_38628626
- 粉丝: 5
- 资源: 944
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Vue+NodeJS的学生社团管理系统(前后端代码)
- 基于SSM+JSP的快递管理系统(前后端代码)
- 全球火点数据-modis-2015-2023年
- YOLOv8完整网络结构图详细visio
- LCD1602电子时钟程序
- 西北太平洋热带气旋【灾害风险统计】及【登陆我国次数评估】数据集-1980-2023
- 全球干旱数据集【自校准帕尔默干旱程度指数scPDSI】-190101-202312-0.5x0.5
- 基于Python实现的VAE(变分自编码器)训练算法源代码+使用说明
- 全球干旱数据集【标准化降水蒸发指数SPEI-12】-190101-202312-0.5x0.5
- C语言小游戏-五子棋-详细代码可运行
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功