设为首页 收藏本站
查看: 718|回复: 0

[经验分享] python装饰器

[复制链接]

尚未签到

发表于 2015-4-23 10:50:40 | 显示全部楼层 |阅读模式
  参考资料:
  
  
1. Python装饰器学习 http://blog.iyunv.com/thy38/article/details/4471421
  
2. Python装饰器与面向切面编程 http://www.iyunv.com/huxi/archive/2011/03/01/1967600.html
  
3. Python装饰器的理解 http://apps.hi.baidu.com/share/detail/17572338


  装饰器其实也就是一个函数,一个用来包装函数的函数,返回一个修改之后的函数对象,将其重新赋值原来的标识符,并永久丧失对原始函数对象的访问,要注意的是装饰函数必须返回被装饰的函数,否则会出错!


  1.无参数的装饰器
  

def deco(func):
print 'This is func'
return func  #一定要有返回值
@deco
def b(a):
print 'This is b,more:'+str(a)
if __name__=='__main__':
b('hello,kity')

运行结果为:  
  

This is func
This is b,more:hello,kity
  其中函数b式被装饰的函数,函数deco式装饰函数。由于添加了装饰器,所以调用之前等价于有赋值语句:
  

b = deco(b)

所以调用的时候顺序依次为:调用deco函数,参数为b,在函数deco中先打印出'This is func'语句,之后返回函数引用b,然后调用被修饰的函数b,参数为'hello,kity'。  
  


  


  2.有参数的装饰器
  

import time
def deco(func):
def _inf(a):
t = time.clock()
func(a)
print 'used:',time.clock()-t
#return func
return _inf
@deco
def b(a):
print 'This is b,more:'+str(a)
if __name__=='__main__':
b('hello,kity')

运行结果为:  
  

This is b,more:hello,kity
used: 2.19307966712e-05


  
  因为要在修饰函数内调用函数func,而且有参数,但是如果不在装饰器内定义新的函数,这个参数是无法获取的,像上面的情况,虽然也有参数,但是这个是在修饰器是在外面使用的参数(由修饰器返回函数引用,再通过该应用来调用参数,所以不属于修饰器内),所以需要定义新的函数。
  调用顺序为:调用b('hello,kity')时,先调用装饰函数deco,由于装饰函数内只返回其内建的新函数,所以该函数直接返回内建函数的引用,然后通过该引用调用参数,此时就会调用deco的内建函数_inf,参数为'hello,kity',所以就会计时,然后打印出来。
  


  3.内置的装饰函数
  


  内置的装饰器有三个,分别是staticmethod、classmethod和property,作用分别是把类中定义的实例方法变成静态方法、类方法和类属性。


  


  import time
def deco(func):
def _inf(a):
t = time.clock()
func(a)
print 'used:',time.clock()-t
#return func
return _inf
@deco
def b(a):
print 'This is b,more:'+str(a)

class Point(object):
def __init__(self,name):
self.name = name
print '__init__','set name to:',self._name
@staticmethod
def size(self):
print 'sorry,ihave no size!'
@classmethod
def cf(self):
return Point('')
@property
def name(self):
return self.name
@name.setter
def name(self,name):
self._name = name

if __name__=='__main__':
b('hello,kity')
p = Point('p1')
Point.cf()
p.cf()




  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59979-1-1.html 上篇帖子: python set详解 下篇帖子: python httpConnection详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表