• 【Python】 装饰器 Vivid


    装饰器

    @wraps

    def decorator(func):
        """this is decorator __doc__"""
    
        def wrapper(*args, **kwargs):
            """this is wrapper __doc__"""
            print("this is wrapper method")
            return func(*args, **kwargs)
    
        return wrapper
    
    
    @decorator
    def test():
        """this is test __doc__"""
        print("this is test method")
    
    
    if __name__ == '__main__':
        print("__name__: ", test.__name__)
        print("__doc__:  ", test.__doc__)
    
    """
        __name__:  wrapper
        __doc__:   this is wrapper __doc__
    """
    
    def decorator(func):
        """this is decorator __doc__"""
    
        @wraps(func)
        def wrapper(*args, **kwargs):
            """this is wrapper __doc__"""
            print("this is wrapper method")
            return func(*args, **kwargs)
    
        return wrapper
    
    
    @decorator
    def test():
        """this is test __doc__"""
        print("this is test method")
    
    
    if __name__ == '__main__':
        print("__name__: ", test.__name__)
        print("__doc__:  ", test.__doc__)
        
    """
    __name__:  test
    __doc__:   this is test __doc__
    """
    

    装饰函数

    无参数

    \[decorate(fun)(1, 2, c=3)\,==>\,inner(1, 2, c=3) \]

    def decorate(fn):
        print("-decorate() start")
    
        @functools.wraps(fn)
        def inner(*args, **kwargs):
            print("--inner() start")
            print(f'--inner: args=={args}, kwargs=={kwargs}')
            fn(*args, **kwargs)
            print("--inner() end")
    
        print("-decorate() end")
        return inner
    
    
    @decorate
    def fun(a, b, c):
        print("----fun() start")
        print(f'----fun: a=={a}, b=={b}, c=={c}')
        print("----fun() end")
    
    
    if __name__ == '__main__':
        print('-main() start')
        fun(1, 2, c=3)
        print('-main() end')
    
    """
    -decorate() start
    -decorate() end
    -main() start
    --inner() start
    --inner: args==(1, 2), kwargs=={'c': 3}
    ----fun() start
    ----fun: a==1, b==2, c==3
    ----fun() end
    --inner() end
    -main() end
    """
    

    有参数

    \[decorate(-1,-2,-3)fun(1,2,c=3)\,==>\,wrap(fun)(1,2,c=3)\,==>\,inner(1,2,c=3) \]

    def decorate(a, b, c):
        print('-decorate() start')
    
        def wrap(fn):
            print('-wrap() start')
            print(f'-warp: a=={a}, b=={b}, c=={c}')
    
            @functools.wraps(fn)
            def inner(*args, **kwargs):
                print("--inner() start")
                print(f'--inner: a=={a}, b=={b}, c=={c}')
                print(f'--inner: args=={args}, kwargs=={kwargs}')
                fn(*args, **kwargs)
                print("--inner() end")
    
            print('-wrap() end')
            return inner
    
        print('-decorate() end')
        return wrap
    
    
    @decorate(-1, -2, -3)
    def fun(a, b, c):
        print("----fun() start")
        print(f'----fun: a=={a}, b=={b}, c=={c}')
        print("----fun() end")
    
    
    if __name__ == '__main__':
        print('-main() start')
        fun(1, 2, c=3)
        print('-main() end')
    
    """
    -decorate() start
    -decorate() end
    -wrap() start
    -warp: a==-1, b==-2, c==-3
    -wrap() end
    -main() start
    --inner() start
    --inner: a==-1, b==-2, c==-3
    --inner: args==(1, 2), kwargs=={'c': 3}
    ----fun() start
    ----fun: a==1, b==2, c==3
    ----fun() end
    --inner() end
    -main() end
    """
    

    装饰类

    无参数

    \[decorate(A)(1, 2, c=3)\,==>\,inner(1, 2, c=3) \]

    def decorate(cls):
        print('-decorate() start')
    
        @functools.wraps(cls)
        def inner(*args, **kwargs):
            print("--inner() start")
            print(f'--inner: args=={args}, kwargs=={kwargs}')
            print("--inner() end")
            return cls(*args, **kwargs)
    
        print('-decorate() end')
        return inner
    
    
    @decorate
    class A:
        def __init__(self, a, b, c):
            self.a = a
            self.b = b
            self.c = c
    
            
    if __name__ == '__main__':
        print('-main() start')
        a = A(1, 2, c=3)
        print('-main() end')
        
    """
    -decorate() start
    -decorate() end
    -main() start
    --inner() start
    --inner: args==(1, 2), kwargs=={'c': 3}
    --inner() end
    -main() end
    """
    

    有参数

    \[decorate(-1, -2, -3)A(1, 2, c=3)\,==>\,wrap(A)(1, 2, c=3)\,==>\,inner(1, 2, c=3) \]

    def decorate(a, b, c):
        print('-decorate() start')
    
        def wrap(cls):
            print('-wrap() start')
            print(f'-warp: a=={a}, b=={b}, c=={c}')
    
            @functools.wraps(cls)
            def inner(*args, **kwargs):
                print("--inner() start")
                print(f'--inner: a=={a}, b=={b}, c=={c}')
                print(f'--inner: args=={args}, kwargs=={kwargs}')
                print("--inner() end")
                return cls(*args, **kwargs)
    
            print('-wrap() end')
            return inner
    
        print('-decorate() end')
        return wrap
    
    
    @decorate(-1, -2, -3)
    class A:
        def __init__(self, a, b, c):
            self.a = a
            self.b = b
            self.c = c
    
    
    if __name__ == '__main__':
        print('-main() start')
        a = A(1, 2, c=3)
        print('-main() end')
        
    """
    -decorate() start
    -decorate() end
    -wrap() start
    -warp: a==-1, b==-2, c==-3
    -wrap() end
    -main() start
    --inner() start
    --inner: a==-1, b==-2, c==-3
    --inner: args==(1, 2), kwargs=={'c': 3}
    --inner() end
    -main() end
    """
    

    有无括号

    \[decorate()fun(1, 2, c=3)\,==>\,inner(fun)(1, 2, c=3)\,==>\,fun(1, 2, c=3) \]

    def decorate():
        print("-decorate() start")
    
        def inner(fn):
            print("--inner() start")
            print("--inner() end")
            return fn
    
        print("-decorate() end")
        return inner
    
    
    @decorate()
    def fun(a, b, c):
        print("----fun() start")
        print(f'----fun: a=={a}, b=={b}, c=={c}')
        print("----fun() end")
    
    
    if __name__ == '__main__':
        print('-main() start')
        fun(1, 2, c=3)
        print('-main() end')
        
    """
    -decorate() start
    -decorate() end
    --inner() start
    --inner() end
    -main() start
    ----fun() start
    ----fun: a==1, b==2, c==3
    ----fun() end
    -main() end
    """
    
  • 相关阅读:
    kubernetes系列(十四)
    kubernetes系列(十三)
    kubernetes系列(十二)
    kubernetes系列(十一)
    kubernetes系列(十)
    kubernetes系列(九)
    kubernetes系列(八)
    MySQL命令(其三)
    MySQL操作命令(其二)
    MySQL命令(其一)
  • 原文地址:https://www.cnblogs.com/VividBinGo/p/15878617.html
Copyright © 2020-2023  润新知