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

    装饰器

    def document_it(func):
        def new_function(*args, **kwargs):
            print('Running function:', func.__name__)
            print('Positional arguments:', args)
            print('Keyword arguments:', kwargs)
            result = func(*args, **kwargs)
            print('Result:', result)
            return result
        return new_function
    
    #def add_ints(a, b):
    #    return a + b
    #cooler_add_ints = document_it(add_ints)
    #cooler_add_ints(3, 5)
    #('Running function:', 'add_ints')
    #('Positional arguments:', (3, 5))
    #('Keyword arguments:', {})
    #('Result:', 8)
    
    #@document_it
    #def add_ints(a, b):
    #    return a + b
    
    #add_ints(3, 5)
    
    
    def square_it(func):
        def new_function(*args, **kwargs):
            result = func(*args, **kwargs)
            return result * result
        return new_function
    
    #@square_it
    #@document_it
    #def add_ints(a, b):
    #    return a + b
    
    #add_ints(3, 5)
    
    #('Running function:', 'add_ints')
    #('Positional arguments:', (3, 5))
    #('Keyword arguments:', {})
    #('Result:', 8)
    
    
    @document_it
    @square_it
    def add_ints(a, b):
        return a + b
    
    add_ints(3, 5)
    
    #('Running function:', 'new_function')
    #('Positional arguments:', (3, 5))
    #('Keyword arguments:', {})
    #('Result:', 64)
    
    #靠近函数定义的装饰器最先执行
    def log(func):
        def wrapper(*args, **kw):
            print('call %s():' % func.__name__)
            return func(*args, **kw)
        return wrapper
    
    
    @log
    def now():
        print('2015-3-25')
    
    
    now()
    
    #call now():
    #2015-3-25

    如果decorator本身需要传入参数

    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('2015-3-25')
    
    now()
    
    print(now.__name__)
    
    #execute now():
    #2015-3-25
    #wrapper

    不需要编写wrapper.__name__ = func.__name__这样的代码,Python内置的functools.wraps就是干这个事的

    相当于:

    now = log(now)
    now = log('execute')(now)

  • 相关阅读:
    P3973 [TJOI2015]线性代数
    P3168 [CQOI2015]任务查询系统
    二次剩余学习笔记
    URL注入攻击+知识星球资源整理
    我的网络安全架构知识点的总结(待完善)
    Sudo提权
    DNSlog平台各种利用姿势(盲注)
    Wireshark抓包理论加实操
    Fofa搜索技巧(理论加实践的整理)
    Windows留后门维持权限(其中包括详细的telnet改端口与连接)
  • 原文地址:https://www.cnblogs.com/jzm17173/p/5190431.html
Copyright © 2011-2022 走看看