zoukankan      html  css  js  c++  java
  • python 装饰器

    在代码运行期间动态增加功能的方式,叫装饰器docorator

    docorator 就是一个返回函数的高阶函数

    # _*_ coding:utf-8 _*_
    import functools
    import time


    # 编写装饰函数,在函数执行之前打印 call func.__name__
    def log(func):#func是传入的函数,要执行的函数
    @functools.wraps(func)#加这行是为了使返回的函数名变成func.__name__,不加这行的话返回的函数名是 wrapper.__name__
    def wrapper(*args, **kw):
    print('call %s():' % func.__name__)#在函数执行之前打印‘call func.__name__’
    return func(*args, **kw)#执行func函数

    return wrapper


    @log #在装饰函数之前加一个@来调用装饰函数,写在定义的函数now()的前面,那么在执行now()之前会先执行log()这个装饰函数
    def now():
    print('2015-3-25')


    f = now
    f()#调用now函数,相当于执行了语句 now= log(now)
    print(f.__name__)

    #如果docorator本身需要传入参数,函数如下,有3层的嵌套
    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 now1():
    print('2018-01-12')


    f1 = now1
    f1()
    print(f1.__name__)


    # 请设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间:
    def metric(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kw):
    start = time.time()
    result = fn(*args, **kw)
    end = time.time()
    print('%s executed in %.2fs ms' % (fn.__name__, (end - start) * 1000))
    return result

    return wrapper


    @metric
    def now2(x, y):
    time.sleep(1)
    return (x + y)


    f = now2(10, 20)
    if f == 30:
    print('pass')
    else:
    print('failed')


    # 请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call'的日志
    def printBeginEndCall(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kw):
    print('begin call')
    result = fn(*args, **kw)
    print('%s() is executed at %s' % (fn.__name__, time.asctime(time.localtime())))
    print('end call')
    return result

    return wrapper


    @printBeginEndCall
    def fast(num):
    return (num ** 2)


    i = fast(3)
    print(i)

    #编写一个装饰函数,同时支持@log和@log(text)
    #这个代码存在问题,但是我不知道为什么
    def log(t):
    if isinstance(t, str):
    def decorator(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kw):
    print('%s %s()' % (t, fn.__name__))
    return fn(*args, **kw)

    return wrapper

    return decorator

    else:
    @functools.wraps(t)
    def wrapper(*args, **kw):
    print('%s() is executed' % t.__name__)
    return t(*args, **kw)

    return wrapper


    @log('start executing')
    def test(x):
    return x ** 3


    f = test(6)
    print(f)


    @log()
    def test2(y):
    return (y ** 3)


    f1 = test2(10)
    print(f1)
  • 相关阅读:
    mysql中删除重复记录,并保留重复数据中的一条数据的SQL语句
    架构设计文档提纲简描
    各大互联网公司架构演进之路汇总
    大数据安全规范
    生活启示
    mysql数据库分库分表(Sharding)
    大数据风控指标----查准率与查全率
    YARN和MapReduce的内存设置参考
    不要在linux上启用net.ipv4.tcp_tw_recycle参数
    [Spark经验一]Spark RDD计算使用的函数里尽量不要使用全局变量
  • 原文地址:https://www.cnblogs.com/xiaohai2003ly/p/8277456.html
Copyright © 2011-2022 走看看