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

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

参考资料:

1. Python装饰器学习 

2. Python装饰器与面向切面编程 

3. Python装饰器的理解 http://apps.hi.baidu.com/share/detail/17572338

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

1.无参数的装饰器

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

This is funcThis is b,more:hello,kity

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

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

2.有参数的装饰器

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

This is b,more:hello,kityused: 2.19307966712e-05

因为要在修饰函数内调用函数func,而且有参数,但是如果不在装饰器内定义新的函数,这个参数是无法获取的,像上面的情况,虽然也有参数,但是这个是在修饰器是在外面使用的参数(由修饰器返回函数引用,再通过该应用来调用参数,所以不属于修饰器内),所以需要定义新的函数。

调用顺序为:调用b('hello,kity')时,先调用装饰函数deco,由于装饰函数内只返回其内建的新函数,所以该函数直接返回内建函数的引用,然后通过该引用调用参数,此时就会调用deco的内建函数_inf,参数为'hello,kity',所以就会计时,然后打印出来。

3.内置的装饰函数

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

import timedef deco(func):    def _inf(a):        t = time.clock()        func(a)        print 'used:',time.clock()-t    #return func    return _inf@decodef 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()

转载于:https://www.cnblogs.com/arbboter/archive/2012/10/01/4225232.html

你可能感兴趣的文章
单页数据多iOS预加载的方法
查看>>
acm计划(更新于2014.11.9)
查看>>
hdu3364 高斯消元1(开关控制灯,异或解的个数)
查看>>
Python网络编程1:套接字
查看>>
Complete Physics Platformer Kit 学习
查看>>
软件工程---删除重复数组
查看>>
ubuntu16 64 搭建lnmp环境
查看>>
数据结构中的图
查看>>
设计模式:结构型模式总结
查看>>
HDU 1260:Tickets(DP)
查看>>
Codeforces 1080C- Masha and two friends
查看>>
使用CRT定位内存泄漏
查看>>
异常的处理方式
查看>>
JavaScrip 数组/字典/循环
查看>>
C#Question:“XXX”的重载均与“System.Threading.WaitCallback”不匹配。
查看>>
linux service等命令不能使用的解决办法
查看>>
java学习笔记(Core Java)5 继承
查看>>
算法(3)—— 链表习题 完结
查看>>
详谈外部浏览器如何实现复制公众号一键唤起微信添加关注
查看>>
c++ 快速排序
查看>>