|
|
|
|
移动端

2.2.3 装饰器(4)

《Python高级编程(第2版)》第2章语法最佳实践——类级别以下,本章将介绍现在这门语言的语法中最重要的元素,以及它们的使用技巧。本节为大家介绍装饰器。

作者:张亮/阿信 译来源:人民邮电出版社|2018-01-29 18:33

技术沙龙 | 6月30日与多位专家探讨技术高速发展下如何应对运维新挑战!


2.2.3 装饰器(4)

这一模型常用于Python Web框架中,用于定义可发布类的安全性。例如,Django提供装饰器来保护函数访问的安全。

下面是一个示例,当前用户被保存在一个全局变量中。在方法被访问时装饰器会检查他/她的角色:

  1. >>> tarek = User(('admin', 'user'))  
  2. >>> bill = User(('user',))  
  3. >>> class MySecrets(object):  
  4. ...     @protect('admin')  
  5. ...     def waffle_recipe(self):  
  6. ...         print('use tons of butter!')  
  7. ...  
  8. >>> these_are = MySecrets()  
  9. >>> user = tarek 
  10. >>> these_are.waffle_recipe()  
  11. use tons of butter!  
  12. >>> user = bill 
  13. >>> these_are.waffle_recipe()  
  14. Traceback (most recent call last):  
  15. File "< stdin>", line 1, in < module> 
  16. File "< stdin>", line 7, in wrap  
  17. __main__.Unauthorized: I won't tell you 

(4)上下文提供者

上下文装饰器确保函数可以运行在正确的上下文中,或者在函数前后运行一些代码。换句话说,它设定并复位一个特定的执行环境。举个例子,当一个数据项需要在多个线程之间共享时,就要用一个锁来保护它避免多次访问。这个锁可以在装饰器中编写,代码如下:

  1. from threading import RLock  
  2. lock = RLock()  
  3.  
  4. def synchronized(function):  
  5.     def _synchronized(*args, **kw):  
  6.         lock.acquire()  
  7.         try:  
  8.             return function(*args, **kw)  
  9.         finally:  
  10.             lock.release()  
  11.         return _synchronized  
  12.  
  13. @synchronized  
  14. def thread_safe():  # 确保锁定资源  
  15.     pass 

上下文装饰器通常会被上下文管理器(with语句)替代,后者将在本章后面介绍。

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

51CTO读书频道二维码


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

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

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

读 书 +更多

无懈可击的Web设计

一个网站,无论视觉上多美观或者内容多丰富,如果它不能适应各种浏览情况并能面向尽可能广泛的用户群,那它就不算是真正成功的网站。本书提...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊