专栏首页python3python 高阶函数:Decorato

python 高阶函数:Decorato

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

一、不带参数的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()

log(now())

print "now_name:%s"%now.__name__

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

二、带参数的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__ 

now()

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

三、完整的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__  

now()

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

补充:

  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:

图2:

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • pythn print格式化输出----

    %r 用来做 debug 比较好,因为它会显示变量的原始数据(raw data),而其它的符 号则是用来向用户显示输出的。

    py3study
  • Python_类的属性

    1.类属性分类 类的属性分为: 数据属性:就是类中的变量; 函数属性:就是类中函数,在面向对象设计中通常称为方法; 类和对象的属性均使用点(.)来访问自己...

    py3study
  • Python全栈学习_day002知识点

    py3study
  • 简单讲讲python装饰器

    装饰器其实是闭包的一种,如果有重复功能需要实现的话,装饰器是个不错的选择。比如每个函数需要添加一个提示开始的功能:

    生信编程日常
  • ACL 2016:基于深度学习的 NLP 看点

    【新智元导读】计算语言领域顶级会议ACL2016今天公布了10篇优秀论文(outstanding paper)名单。本文介绍 ACL 2016 概况,同时收录清...

    新智元
  • python os.walk的用法与举例

    os.walk(top, topdown=True, onerror=None, followlinks=False) 

    py3study
  • Python 函数作为参数传递

    #map()的功能是将函数对象依次作用于表的每一个元素,每次作用的结...

    py3study
  • 70个NumPy练习:在Python下一举搞定机器学习矩阵运算

    用户1737318
  • 520没对象?那来学下Python类与对象

    类可以看成是抽象的模板,比如:智能手机。对象就是根据这个模板制造出来的实物,比如iPhone ,华为,小米,OPPO等各种品牌的智能手机。

    吾非同
  • python第二十课——math模块中常用的函数

    属性: e:自然数 pi:圆周率 函数: ceil():向上取整 floor():向下取整 sqrt():开平方根 radians():角度转弧度...

    hankleo

扫码关注云+社区

领取腾讯云代金券