zoukankan      html  css  js  c++  java
  • python -- 带有参数的装饰器

    1.带有参数的装饰器示例

    def decorator(arg1, arg2):
        def real_decorator(func):
            def wrapper(*args, **kwargs):
                print("You decorated a function that does something with %s and %s" % (arg1, arg2))
                func(*args, **kwargs)
            return wrapper
    
        return real_decorator
    
    @decorator("args1", "args2")
    def print_args(*args):
        for arg in args:
            print(arg)
    
    
    print_args(1, 2, 3)
    

    测试结果

    >>> print_args(1, 2, 3)
    You decorated a function that does something with args1 and args2
    1
    2
    3
    >>> 
    

    2.基于类的装饰器

    class MyDecorator(object):
        def __init__(self, func_to_decorate):
            print("init MyDecorator")
            self.func_to_decorate = func_to_decorate
    
        def __call__(self, *args, **kwargs):
            print("call MyDecorator")
            return self.func_to_decorate(*args, **kwargs)
    
    @MyDecorator
    def print_more_args(*args):
        for arg in args:
            print(arg)
    
    print_more_args(1, 2, 3)
    print("------------")
    print_more_args(1, 2, 3)
    

    测试结果

    init MyDecorator
    call MyDecorator
    1
    2
    3
    ------------
    call MyDecorator
    1
    2
    3
    

      

    3.带有参数的基于类的装饰器

    class MyDecoratorWithParams(object):
        def __init__(self, arg1, arg2):
            print("init MyDecoratorWithParams")
            print(arg1)
            print(arg2)
    
        def __call__(self, fn, *args, **kwargs):
            print("call MyDecoratorWithParams")
    
            def new_func(*args, **kwargs):
                print("function has been decorated.")
                return fn(*args,**kwargs)
    
            return new_func
    
    @MyDecoratorWithParams("arg1", "arg2")
    def print_args_again(*args):
        for arg in args:
            print(arg)
    
    print_args_again(1, 2, 3)
    print("----------------")
    print_args_again(1, 2, 3)
    

    测试结果:

    init MyDecoratorWithParams
    arg1
    arg2
    call MyDecoratorWithParams
    function has been decorated.
    1
    2
    3
    ----------------
    function has been decorated.
    1
    2
    3
    

      

  • 相关阅读:
    [NOIP2010] 引水入城
    BZOJ 3038 线段树
    [Tyvj 1728]普通平衡树 5种姿势 (彩蛋)
    BZOJ 1588: [HNOI2002]营业额统计
    BZOJ 2141 排队 线段树套替罪羊
    BZOJ 3629 [JLOI2014] 聪明的燕姿 dfs
    P1546 [USACO3.1]最短网络 Agri-Net(洛谷)
    并查集详解+模板
    sync_with_stdio和cin.tie(0); cout.tie(0);
    拓扑排序详解
  • 原文地址:https://www.cnblogs.com/abclife/p/7462860.html
Copyright © 2011-2022 走看看