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()

    友情链接:





  • 相关阅读:
    水调歌头·1024
    网页开发方式-从静态页面到服务端渲染
    完美融合 nextjs 和 antd
    commanderJs编写命令行工具(cli)
    [信息安全] 05 X.509 公钥证书的格式标准
    [Cake] 3. dotnet 本地工具 cake & dotnet format
    [计算机网络] 00 概述
    [Cake] 2. dotnet 全局工具 cake
    [解读REST] 0.REST 相关参考资料
    [OIDC in Action] 3. 基于OIDC(OpenID Connect)的SSO(添加Github OAuth 2.0的支持)
  • 原文地址:https://www.cnblogs.com/ChaoyuanJam/p/9741458.html
Copyright © 2011-2022 走看看