|
|
|
|
移动端

3.3.2 装饰器的用法(2)

《自学Python:编程基础、科学计算及数据分析》第3章Python 进阶,在本章中,我们将学习 Python的一些进阶用法,包括函数的进阶,迭代器、生成器、装饰器、上下文管理器的使用,以及 Python中的变量作用域。本节为大家介绍装饰器的用法。

作者:李金来源:机械工业出版社|2018-05-04 13:43

人工智能+区块链的发展趋势及应用调研报告


3.3.2 装饰器的用法(2)

3. 装饰器工厂

装饰器还支持这样的用法:

  1. @A  
  2. @B  
  3. @C(args)  
  4. def f(): ... 

这种用法相当于:

  1. D = C(args)  
  2. f=A(B(D(f))) 

即将C(args)的返回值看成一个新的装饰器D。我们通过给函数 C传入不同的参数,可以生成不同的装饰器函数,因此有人将函数 C称为装饰器工厂(Decorator factory)。

在之前的例子中,我们定义了 plus_one和 times_two两个装饰器,现在我们可以将它们一般化为装饰器工厂。首先将plus_one一般化为一个名为plus_n的装饰器工厂:

  1. In [12]: def plus_n(n):  
  2. ...: def plus_dec(f)  
  3. ...: def new_func(x):  
  4. ...: return f(x) + n  
  5. ...: return new_func  
  6. ...: return plus_dec  
  7. ...: 

plus_n()函数接受一个参数 n,返回一个装饰器函数,该装饰器函数接受一个函数作为
参数,并让函数的返回值加n。

在这个定义下,装饰器plus_one相当于plus_n(1)。

同样的道理,我们将times_two一般化为一个名为 times_n的装饰器工厂:

  1. In [13]: def times_n(n):  
  2. ...: def times_dec(f)  
  3. ...: def new_func(x):  
  4. ...: return f(x) * n  
  5. ...: return new_func  
  6. ...: return times_dec  
  7. ...: 

times_n()函数接受一个参数n,返回一个实现返回值乘 n的装饰器函数。

在这个定义下,装饰器times_two相当于times_n(2)。

我们可以这样重新定义foo:

  1. In [14]: @plus_n(1)  
  2. ...: @times_n(2)  
  3. ...: def foo(x):  
  4. ...: return x  
  5. ...:  
  6. In [15]: foo(13)  
  7. Out[15]: 27 


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

主流ARM嵌入式系统设计技术与实例精解

本书重点介绍了主流ARM应用系统的开发与实践。全书基于目前较为通用、流行的ARM处理器,介绍了其原理、硬件结构、硬件电路设计与开发和软件...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊