python 高阶函数:Decorator(装饰器)
admin
2023-07-24 01:01:49
0次

装饰器:原函数基础 ------> 动态添加功能


一、不带参数的decorator

#decorator封装

def log(func):
    def wrapper(*args, **kw):
        print 'call %s():' %func.__name__
        return func(*args, **kw)
    return wrapper


#此函数一定要放在 def log(func): 之后

@log   
def now():
    print "haha"

   
now()

python 高阶函数:Decorator(装饰器)


log(now())
python 高阶函数:Decorator(装饰器)


print "now_name:%s"%now.__name__

python 高阶函数:Decorator(装饰器)


简单的图解:(待以后深入理解后再详细补)

python 高阶函数:Decorator(装饰器)


二、带参数的docurator

#!/usr/bin/python

#docurator封装

def log(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator


@log('execute')
def now():
    print "haha"    


print "now_name:%s"%now.__name__ 

python 高阶函数:Decorator(装饰器)


now()

python 高阶函数:Decorator(装饰器)


print log('execute')
print log(now)
print log('execute')(now)

python 高阶函数:Decorator(装饰器)


三、完整的decorator的写法:Python内置的functools.wraps  

import functools  #导入functools模块

def log(text):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

@log('execute')
def now():
    print "haha"
   
print "now_name:%s"%now.__name__  

python 高阶函数:Decorator(装饰器)

now()

python 高阶函数:Decorator(装饰器)

print log('execute')
print log(now)
print log('execute')(now)

python 高阶函数:Decorator(装饰器)



--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

日期:2018/8/18

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

补充:

  1. 多个装饰器的执行顺序是无序的,但执行过程是有序的。

  2. 装饰器执行过程是:遇到外接函数就跳转到另一个装饰器中执行,若再另一个装饰器中遇到同样的外接函数,则继续执行


证明1:多个装饰器的执行顺序是无序的

#!/usr/bin/python
# -*- coding: utf-8 -*-

import time


def extend(func):
    def wrapper(*args, **kwargs):
        print "Begin AAAAAA"
        func(*args, **kwargs)
        print("A:%s"%(func.__name__))
        print(reduce(lambda x,y:x+y, args), kwargs)
        print "End AAAAA"
    return wrapper


def extend1(func):
    def wrapper(*args, **kwargs):
        print "Begin BBBBB"
        func(*args, **kwargs)
        print("B:%s"%(func.__name__))
        print(map(lambda x:x*2, args), kwargs)
        print "End BBBBB"    
    return wrapper

@extend      
@extend1
def get_time1(*args,**kwargs):
    begin_time = time.time()
    for n in range(3,4):
        time.sleep(1)
    end_time = time.time()
    print("run %d "% (end_time - begin_time))
    #print(reduce(lambda x,y:x+y, args), kwargs)

    
if __name__ == "__main__":

    get_time1(1,2,3,4,5,6,ma=1,du=2)

执行结果:先从第一个装饰器标志@extend开始

Begin AAAAAA
Begin BBBBB
run 1 
B:get_time1
([2, 4, 6, 8, 10, 12], {'du': 2, 'ma': 1})
End BBBBB
A:wrapper
(21, {'du': 2, 'ma': 1})
End AAAAA


另一个例子:

#!/usr/bin/python
# -*- coding: utf-8 -*-
def dec1(func):  
    print("1111")  
    def wrapper(*args, **kwargs):  
        print("2222")  
        func()  
        print("3333")  
    return wrapper  

def dec2(func):  
    print("aaaa")  
    def wrapper(*args, **kwargs):  
        print("bbbb")  
        func()  
        print("cccc")  
    return wrapper  

@dec1  
@dec2  
def test():  
    print("test test")  

test()

运行结果:从第二个装饰器标志@dec2开始

aaaa
1111
2222
bbbb
test test
cccc
3333


通过比较,多个解释器的执行顺序是无序的。若大家觉得证明不够严谨,可自己多添几个试试。


证明2:装饰器的执行过程是有序的

图1:

python 高阶函数:Decorator(装饰器)


图2:

python 高阶函数:Decorator(装饰器)




没看懂?没关系,进行步骤解析:

python 高阶函数:Decorator(装饰器)



-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2018/8/20

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

补充:一个讲的很好的BLOG:  https://blog.csdn.net/xiangxianghehe/article/details/77170585


相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...