zoukankan      html  css  js  c++  java
  • 【廖雪峰老师python教程】——装饰器

    装饰器


    # 一个函数装饰器的列子
    def log(func):
        def wrapper(*args,**kwargs):
            print('Name=%s'%func.__name__)
            return func(*args,**kwargs)
        return wrapper
    @log
    def Print():
        print('2017-2-3')
        return None
    Print()
    '''
    观察上面的log,因为它是一个decorator,所以接受一个函数作为参数,并返回一个函数。
    通过@方法调用后,调用log输入Print为参数函数,在wrapper中修改,然后整合成为新的函数返回
    '''
    D:untitled1venvScriptspython.exe D:/untitled1/装饰器.py
    Name=Print
    2017-2-3

    常用装饰器模板


    •  无参数的装饰器:【因为返回的那个wrapper()函数名字就是'wrapper',所以,需要把原始函数的__name__等属性复制到wrapper()函数中,否则,有些依赖函数签名的代码执行就会出错。】
    import functools
    
    def log(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print('call %s():' % func.__name__)
            return func(*args, **kw)
        return wrapper
    • 有参数的装饰器:【因为返回的那个wrapper()函数名字就是'wrapper',所以,需要把原始函数的__name__等属性复制到wrapper()函数中,否则,有些依赖函数签名的代码执行就会出错。】
    import 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

    装饰器案例


    # 一个装饰器计算函数执行时间
    import time, functools
    def log(func):
        @functools.wraps(func)    # 保证函数名一致的方法
        def wrapper(*args, **kw):
            ''' 下面三个为装饰器装饰后的功能增加项 '''
            oldTime = time.process_time()
            result = func(*args, **kw)
            newTime = time.process_time()
            print('函数 %s 运行时间为 %s ms' % (func.__name__ ,newTime - oldTime))
            return result
        return wrapper
    @log
    def test():
        for x in range(1, 10000000):
            x += 1
    test()

    友情链接:





  • 相关阅读:
    标题栏中小图标和文字垂直居中的解决办法
    width:100%和width:inherit
    css盒子模型的宽度问题
    position:absolute和margin:auto 连用实现元素水平垂直居中
    超链接a的download属性 实现文件下载功能
    JavaScript的String对象的属性和方法
    原生JavaScript 封装ajax
    深入理解JVM之对象分配流程
    http协议详解
    在RMI方式实现RPC时,为什么业务实现类UserServiceImpl中要显示的创建无参构造方法
  • 原文地址:https://www.cnblogs.com/ChaoyuanJam/p/9741458.html
Copyright © 2011-2022 走看看