博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
@修饰符--python中的装饰器
阅读量:5319 次
发布时间:2019-06-14

本文共 1116 字,大约阅读时间需要 3 分钟。

装饰器模式可以在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责,也能够处理那些可以撤销的职责。经常用于日志记录、性能测试等场合。

想象一下这个很常见的场景,你写了一个方法只提供给以登陆的用户访问(事实上我也是通过django的@login_required才了解到@修饰符的),你可以写以下代码:

 

[python] 
  1. def A():  
  2.     if user.is_login():  
  3.         do something  
  4.     else:  
  5.         pass  

这当然没什么问题,但是你又写了一个方法B,也要求只有登录用户可以访问,于是有写了以下代码:

 

 

[python] 
  1. def B():  
  2.     if user.is_login():  
  3.         do something  
  4.     else:  
  5.         pass  

问题出来了,你在复制粘贴,如果不是两个方法而是一堆方法,你可能就有点受不了啦。当然聪明的你可以想出这个方法:

 

 

[python] 
  1. def A():  
  2.     pass  
  3. def B():  
  4.     pass  
  5. def login_required(fn):  
  6.     def ff():  
  7.         if user.is_login():  
  8.             fn()  
  9.         else:  
  10.             pass  
  11.     return ff  
  12.   
  13. A = login_required(A)  
  14. B = login_required(B)  

 

 

你可能没有想到,对于这么好用的东西,python优雅的支持,这就是@修饰符 

 

[python] 
  1. def login_required(fn):  
  2.     def ff():  
  3.         if user.is_login():  
  4.             fn()  
  5.         else:  
  6.             pass  
  7.     return ff  
  8.  
  9. @login_required  
  10. def A():  
  11.     pass  
  12. @login_required  
  13. def B():  
  14.     pass  

在方法A上边写一个@修饰符,调用方法A的时候会调用修饰符后边的方法B,方法B以A方法为参数,而且需要返回一个可调用的对象,这个可调用的对象会使用A方法提供的参数执行。看这个例子:

 

 

[python] 
  1. #!/usr/bin/env python  
  2.   
  3. def a(fn):  
  4.     print 'a'  
  5.     def d(st):  
  6.         print st+'d'  
  7.     return d  
  8.   
  9. def b(fn):  
  10.     print 'b'  
  11.     return fn  
  12.  
  13. @a  
  14. @b  
  15. def c(st):  
  16.     print st  
  17.       
  18. c('c')  

输出结果:bacd

 

我们调用c('c')的时候会先调用b(c),b(c)打印字符"b"然后返回c,然后再调用a(c),a(c)打印字符"a",然后返回方法d,然后再执行d('c'),打印cd。

转载于:https://www.cnblogs.com/jxrichar/p/3916288.html

你可能感兴趣的文章
Fast R-CNN论文理解
查看>>
走楼梯
查看>>
C# JSON字符串序列化与反序列化
查看>>
HTTPS、SPDY和HTTP/2的性能比较
查看>>
Java变量类型,实例变量 与局部变量 静态变量
查看>>
Angular实践----理解数据绑定过程
查看>>
sublime快捷键
查看>>
mysql操作命令梳理(4)-中文乱码问题
查看>>
Hyper-V Centos7 网络设置 虚拟机固定IP
查看>>
Python环境搭建(安装、验证与卸载)
查看>>
一个.NET通用JSON解析/构建类的实现(c#)
查看>>
Windows Phone开发(31):画刷 转:http://blog.csdn.net/tcjiaan/article/details/7460226
查看>>
Windows Phone开发(5):室内装修 转:http://blog.csdn.net/tcjiaan/article/details/7269014
查看>>
记Angular与Django REST框架的一次合作(2):前端组件化——Angular
查看>>
08.存储Cinder→5.场景学习→08.Backup Volume→1.概述与配置
查看>>
进阶之路(基础篇) - 012 Arduino IDE 添加DHT11传感器第三方库的方法
查看>>
详谈js面向对象 javascript oop,持续更新
查看>>
Javaweb Tomcat 项目部署方式
查看>>
文字半透明显示在图片上
查看>>
express简单原理
查看>>