python-装饰器

  1. 装饰器
  2. 无参装饰器
  3. 有参装饰器

装饰器

  • 装饰器,是修改其他函数的功能的函数

    在原函数不修改的基础上,对原函数功能进行扩展。

    无参装饰器

    def wrapper(main_func):
        def inner():
            print("login function called here.")
            main_func()
            print("log function called here.")
    
        return inner
    
    @wrapper
    def get_data():
        print("I am getting data...")
    
    
    # 调用方式
    get_data()
  • *运行结果如下:**

    login function called here.
    I am getting data...
    log function called here.

运行过程分析:

1. get_data == wrapper(get_data) == inner
2. get_data()== inner()

有参装饰器

def wrapper(user, pwd):
    def outer(main_func):
        def inner(*args, **kwargs):
            print("login function called here.user=[%s],password=[%s]" % (user, pwd))
            main_func(*args, **kwargs)
            print("log function called here.")
        return inner

    return outer


@wrapper("gfc@126.com", "123456")
def get_data(*args, **kwargs):
    print("I am getting data...")
    print(args)
    print(kwargs)


# 调用方式
get_data("Milton", age=18)

运行结果如下:

login function called here.user=[gfc@126.com],password=[123456]
I am getting data...
('Milton',)
{'age': 18}
log function called here.

运行过程分析:

执行get_data(“Milton”,age=18)时:

get_data == wrapper("gfc@126.com","123456")(get_data)
         == outer(get_data)
         == inner
                          
get_data("Milton",age=18) == inner("Milton",age=18)
  1. 先执行wrapper(“gfc@126.com“,”123456”), 返回outer函数
    def outer(main_func):
        def inner(*args, **kwargs):
            print("login function called here.user=[%s],password=[%s]" % (user, pwd))
            main_func(*args, **kwargs)
            print("log function called here.")
        return inner
  2. 执行outer(get_data),返回inner函数
    def inner(*args, **kwargs):
        print("login function called here.user=[%s],password=[%s]" % (user, pwd))
        main_func(*args, **kwargs)
        print("log function called here.")
  3. 执行inner(“Milton”,age=18)

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
My Show My Code