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
    

      

  • 相关阅读:
    结构体struct和typedef后面接指针的含义
    C++中关于指针初始化和使用NULL的理解
    (虚)继承类的内存占用大小
    为什么构造函数不能为虚函数
    C++中变量自动初始化的问题
    CY7C68013A的一点总结
    Altium designer总结
    在Linux系统上限制远程登录的IP
    linux系统如何限制其他用户登录
    使用秘钥对登录Linux系统
  • 原文地址:https://www.cnblogs.com/abclife/p/7462860.html
Copyright © 2011-2022 走看看