前言
初学python时,第一次见到“@”符号,感觉很眼熟,如果是学习过java或者接触过AOP(面向切面编程),对于这个符号应该是比较熟悉的。实际上,python中的@也是AOP思想的一种实现。
python的@,官方语言叫做“decorators”,即装饰器。这是python的一大特性,对于初学者来说,很难透彻的理解decorators。本文以多个python例子为引,层层深入,帮助读者来透彻的理解decorators。
从函数开始
decorators和函数是密不可分的,因此必须对python的函数有所了解,之前我写过一篇函数基础的博客,链接如下:http://yunjianfei.iteye.com/blog/2186064
通过该博客,主要要了解的是:
1. 函数的基本概念:函数名、实参、形参、函数体、函数返回值
2. 作用域、生存周期的概念
嵌套函数与闭包
要理解decorator,嵌套函数与闭包也是需要了解的知识,这里我单独写了一个博客,链接如下:
http://yunjianfei.iteye.com/blog/2186092
通过该博客,主要要了解的是:
1. 函数是对象,所以函数可以在另一个函数中定义(嵌套函数)
2. 函数也可以赋给另一个变量 (类似C语言的函数指针)
3. 函数可以作为参数,也可以作为返回值(不执行该函数,只是返回)
4. 闭包是内部函数可以使用外部函数变量的机制
装饰器(Decorators)
装饰器其实就是调用时,把一个函数作为参数,把此函数封装后,返回一个替代函数。
读起来有点抽象,换句话说:装饰器其实就是在不修改原函数的基础上,在执行原函数的前后执行别的代码
我们看一个简单的例子,下面是手动实现的一个装饰器。
#!/usr/bin/env python def outer(some_func): def inner(): print "before some_func" ret = some_func() # 1 return ret + 1 return inner def foo(): return 1 decorated = outer(foo) # 2 print decorated() print "decorated 's __name__ : " + decorated.__name__
输出结果:
2
decorated 's __name__ : inner
这个例子有以下要点:
1. outer函数有一个名为some_func的参数,在outer函数里定义了一个嵌套函数inner,outer将inner函数作为 返回值返回(注意:并没有去调用inner,只是将inner作为变量返回)
2. inner函数打印了一行字符串,然后调用了some_func,并且在#1处获取了some_func的返回值
3. outer每次调用时,参数some_func的值可能会不同,但是我们都会在inner中去调用这个函数。
4. inner在结束时,其返回值是some_func()+1
5. 在#2处,调用了outer函数(foo函数作为参数),并将返回的inner函数作为赋值给decorated
6.最后调用decorated()函数,执行inner,打印一行,并在inner中调用foo函数,最后返回2
上面这个例子可以用一句话概括:变量decorated是将foo函数装饰后(封装后)的版本,或者说,foo函数前后附加其他的一些代码。
decorated = outer(foo)
上面的这一行代码其实就是装饰器的本质。下面的例子用我们一般见到的“@”,也就是装饰器的一般用法来写,如下:
#!/usr/bin/env python def outer(some_func): def inner(): print "before some_func" ret = some_func() # 1 return ret + 1 return inner @outer def foo(): return 1 print foo() print "foo's __name__ : " + foo.__name__ #2
执行结果为:
2
foo's __name__ : inner
上面的两套代码是等价的。
@outer这一行,实际上执行的就是:
foo = outer(foo)
注意:#2处打印了foo的__name__,打印结果为:inner。这再次印证了我们开头处的一句话:
函数装饰器就是把一个函数作为参数,把此函数封装后,返回一个替代函数。
对应上面的代码,就是:
outer装饰器,把foo函数作为参数,把foo封装成inner后,返回inner。
一定要用嵌套函数吗
第一次看到装饰器的时候,估计有很多人都疑惑过,为啥就是嵌套函数呢?好吧,其实也可以不用嵌套函数的,看下面的例子:
#!/usr/bin/env python some_func = None #1 def outer(func): global some_func some_func = func #2 return inner def inner(): print "before some_func" ret = some_func() # 3 return ret + 1 @outer def foo(): return 1 print foo() print "foo's __name__ : " + foo.__name__
这个例子比上面嵌套函数的装饰器版本复杂了不少,但是效果是等同的。这样一比较,从各个角度来看,嵌套函数的写法显然要简洁很多。
收尾
上面介绍装饰器的时候,其实只是介绍了装饰器里最基本的部分,函数装饰器相关,鉴于篇幅,暂时先不在这里写了。
相关推荐
`kafka_client_decorators`库利用装饰器,允许开发者无需深度理解Kafka底层机制,就能轻松地处理消费消息、错误处理、重试策略等功能。 例如,你可以使用装饰器来自动重试在处理消息时遇到的失败,或者在消费消息前...
而`aws-lambda-decorators`库则是Python开发者在AWS Lambda上进行功能装饰器编程的利器,它简化了Lambda函数的编写和管理。 `aws-lambda-decorators-0.51.tar.gz`这个压缩包中包含了`aws-lambda-decorators`库的...
首先,让我们深入探讨装饰器(Decorators)。装饰器是Python中一种特殊类型的函数,它们可以修改或增强其他函数的功能,而不改变原有函数的源代码。装饰器通过在函数定义前加上`@`符号来应用。例如: ```python def...
Python Decorators是一种函数设计模式,允许用户在不改变原有函数定义的...无论是基本装饰器、参数化装饰器、类实现装饰器还是闭包,它们都是构成Python高级特性的重要组成部分,对于理解Python编程有着重要的意义。
7. **高级编程**:包括元类(metaclasses)、生成器(generators)、装饰器(decorators)等高级特性,它们极大地扩展了 Python 的表达能力和设计模式。 8. **错误和调试**:如何定位和修复程序中的错误,以及使用...
Python 高级主题:生成器、装饰器和元编程 生成器(Generators)是一种特殊的函数,它可以按需生成值,而不是一次性生成所有值。通过使用生成器,你可以节省内存并提高性能。生成器的工作原理是使用 yield 语句来...
本项目“Python-Flask访问控制”着重于实现基于角色的访问控制(Role-Based Access Control,简称RBAC)模型,并通过蓝图(Blueprints)和装饰器(Decorators)进行封装,以便于开发者在Flask应用中轻松集成权限管理...
5. **装饰器(decorators)**:装饰器允许在不修改原始函数代码的情况下扩展其功能。它们通常以`@`符号加装饰器名的形式出现在函数定义之前。 6. **上下文管理器(context managers)**:通过`with`语句实现,用于资源...
总结一下,Python 程序执行时间分析器 Chronic 是一个强大的工具,它利用装饰器和上下文管理器为 Python 开发者提供了一种直观的方式来衡量代码执行时间,从而更好地理解和优化程序性能。通过深入研究 Chronic 的...
《PyPI官网下载 | lambda-decorators-0.5.0.tar.gz——深入解析Python装饰器库》 在Python编程语言中,装饰器是一种强大的工具,可以用来扩展或修改函数、类以及方法的行为,而无需改动它们的源代码。本文将深入...
2. **装饰器(Decorators)**:装饰器是Python中的一个强大工具,可以修改或增强函数、类的行为,而不改变其原始代码。学习如何创建和使用装饰器可以提升代码的灵活性和重用性。 3. **上下文管理器(Context ...
在Python中,还有许多其他高级主题,如装饰器(decorators)用于修改或增强函数行为,生成器(generators)用于创建迭代器,以及上下文管理器(context managers)用于资源的自动获取和释放,如使用with语句处理文件。...
2. **装饰器(Decorators)**:装饰器是Python中一种强大的代码复用机制,它可以修改或增强函数、类的行为。通过@符号来应用装饰器,如`@staticmethod`、`@classmethod`,以及自定义装饰器,如记录日志、性能测试等...
2. **装饰器(Decorators)**:Python中的装饰器是强大的工具,可以用于修改或增强函数、类的行为。它们允许在不改变原始代码的情况下,添加新的功能或改变原有行为。 3. **上下文管理器(Context Managers)**:...
顺便提一句,在继续阅读之前,如果你对Python中的闭包(Closure)概念不清楚,请查看本文结尾后的附录,如果没有闭包的相关概念,很难恰当的理解Python中的装饰器。 在Python中,装饰器被用于用@语法糖修辞的函数或类...
8. **高级特性**:例如装饰器(decorators)、生成器(generators)、上下文管理器(context managers)以及函数式编程概念,如`map()`, `filter()`, `reduce()`等。 9. **标准库**:详尽的文档涵盖了Python 3.4...
6. **装饰器(Decorators)**: - 装饰器是Python的一种函数,用于修改或增强其他函数的功能,如添加日志、性能监控等。 - `@decorator`语法糖使得装饰器使用更加简洁。 - 装饰器可以接收参数,增加其灵活性,实现...
19. **设计模式**:理解常见的设计模式,如工厂模式、单例模式、装饰器模式等,并能应用到Python中。 20. **Python3与Python2的区别**:如print函数、除法运算、Unicode处理等方面的差异。 这些知识点都是Python...
在高级特性中,装饰器(decorators)和生成器(generators)是Python 2.1中的亮点。装饰器允许我们修改或增强函数的行为,而无需改动函数本身。生成器则是一种特殊的迭代器,可以通过yield语句动态生成值,节省内存...
5. **装饰器(Decorators)**:装饰器允许在不修改原有函数或类的基础上,添加新的功能或修改已有行为,是Python中增强代码复用性的重要手段。 6. **属性访问器(Accessors)**:使用`@property`和`@setter`装饰器...