|
|
|
|
移动端

3.3.2 装饰器的用法(1)

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

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

技术沙龙 | 邀您于8月25日与国美/AWS/转转三位专家共同探讨小程序电商实战

3.3.2 装饰器的用法(1)

1.装饰器的原理

装饰器的本质是一个接受函数参数的函数。

我们定义好一个装饰器 A,再用到函数 f的定义上:

  1. @A  
  2. def f():  
  3. ... 

这相当于进行了一个f=A(f)的操作。

更一般地,使用多个装饰器:

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

这相当于进行了一个f=A(B(C(f)))的操作。@操作符必须一行一个,类似“@A@B”或者“@A def f(): ...”这样的定义都是非法的。

2.装饰器的实例

我们定义一个名为deco的装饰器,其作用是给函数加一个.attr属性并返回函数本身:

  1. In [1]: def deco(func):  
  2. ...: func.attr = 'decorated' 
  3. ...: return func  
  4. ...: 

定义一个函数 f,并用 deco装饰,其中,pass关键字表示该函数什么都不做:

  1. In [2]: @deco  
  2. ...: def f():  
  3. ...: pass  
  4. ...: 

定义好的函数 f有一个.attr的属性:

  1. In [3]: f  
  2. Out[3]: <function __main__.f> 
  3. In [4]: f.attr  
  4. Out[4]: 'decorated' 

同一个装饰器可以作用在多个函数上。

例如,定义一个判断函数参数是否为整数的装饰器:

  1. In [5]: def require_int(func):  
  2. ...: def new_func(arg):  
  3. ...: assert isinstance(arg, int)  
  4. ...: return func(arg)  
  5. ...: return new_func  
  6. ...: 

在装饰器函数中我们使用了关键字assert:

  1. assert isinstance(arg, int) 

关键字 assert通常用来检测之后表达式是否为真,如果表达式值为假,assert会抛出一个异常,中断程序。

isinstance()函数用来检查前一个参数 arg是否为后一个参数(通常是类型)的一个实例,如果是,返回True,否则返回False。

将装饰器作用在函数p1和 p2上:

  1. In [6]: @require_int  
  2. ...: def p1(arg):  
  3. ...: print arg  
  4. ...:  
  5. In [7]: @require_int  
  6. ...: def p2(arg):  
  7. ...: print arg*2  
  8. ...: 

这样这两个函数都有了判断参数是否为整数的特性。

多个装饰器可以连续作用在同一个函数上。

例如,先定义两个装饰器,第一个装饰器的作用是将函数返回值加1:

  1. In [8]: def plus_one(f):  
  2. ...: def new_func(x):  
  3. ...: return f(x) + 1  
  4. ...: return new_func  
  5. ...: 

第二个的作用是将函数返回值乘以 2:

  1. In [9]: def times_two(f):  
  2. ...: def new_func(x):  
  3. ...: return f(x) * 2  
  4. ...: return new_func  
  5. ...: 

定义一个返回本身的函数 foo,再加上这两个装饰器:

  1. In [10]: @plus_one  
  2. ...: @times_two  
  3. ...: def foo(x):  
  4. ...: return x  
  5. ...: 

通过装饰器的作用,现在的foo(x)函数返回的结果为2x+1:

  1. In [11]: foo(13)  
  2. Out[11]: 27 


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

51CTO读书频道二维码


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

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

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

读 书 +更多

'ASP.NET'程序设计教程

《ASP.NET程序设计教程》是在总结多年ASP.NET教学和应用项目开发经验基础上编写完成的,编写过程中充分吸取了其他畅销实用教程的成功经验。...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊