zoukankan      html  css  js  c++  java
  • 0515Python基础-带参数的装饰器-多个装饰器

    1、函数的有用信息。

    def login(username, password):

        """

        此函数需要用户名,密码两个参数,完成的是登录的功能。

        :return: True 登录成功。 False登录失败。

        """

        # print(login.__name__)

        # print(login.__doc__)

        print('登录成功...')

        return True

    print(login.__name__)

    print(login.__doc__)

    def wrapper(f):

        def inner(*args, **kwargs):

            print(f.__name__)

            print(f.__doc__)

            """执行函数之前的操作"""

            ret = f(*args, **kwargs)

            """执行函数之后的操作"""

            return ret

        return inner

    @wrapper

    def login(username, password):

        """

        此函数需要用户名,密码两个参数,完成的是登录的功能。

        :return: True 登录成功。 False登录失败。

        """

        print('登录成功...')

        return True

    # print(login.__name__)

    # print(login.__doc__)

    login(1, 2)

    from functools import wraps

    def wrapper(f):

        @wraps(f)

        def inner(*args, **kwargs):

            """执行函数之前的操作"""

            ret = f(*args, **kwargs)

            """执行函数之后的操作"""

            return ret

        return inner

    @wrapper

    def login(username, password):

        """

        此函数需要用户名,密码两个参数,完成的是登录的功能。

        :return: True 登录成功。 False登录失败。

        """

        a = 2

        c = 4

        print('登录成功...')

        return True

    print(login.__name__)

    print(login.__doc__)

    for i in login.__dict__:

        print(i)

    print(dir(login))

    2、带参数的装饰器

    import time

    def timer_out(flag1):  #falg1 = flag

        def timer(f):

            def inner(*args, **kwargs):

                if flag1:

                    start_time = time.time()

                    time.sleep(0.3)

                    ret = f(*args, **kwargs)

                    end_time = time.time()

                    print('执行效率%s' % (end_time-start_time))

                    return ret

                else:

                    ret = f(*args, **kwargs)

                    return ret

            return inner

        return timer

    flag = False

    @timer_out(flag)  # 1,步 timer_out(flag) == timer 2,@与timer结合,变成你熟悉的装饰器 @timer

    def func1():

        print(111)

    @timer_out(flag)

    def func2():

        print(222)

    @timer_out(flag)

    def func3():

        print(333)

    func1()

    func2()

    func3()

    count = 1

    def func4():

        count = count + 1

        print(count)

    func4()

    局部只能引用全局的变量,不能修改,如果要修改,global。

    def func4():

        count = 3

        def inner():

            nonlocal count

            count = count + 1

            print(count)

    func4()

    子函数只能引用父函数的变量,不能修改,如果要修改,nonlocal。

    3、多个装饰器装饰一个函数。

    def wrapper1(func): # func = f函数名

        def inner1():

            print('wrapper1 ,before func')  # 2

            func()

            print('wrapper1 ,after func')  # 4

        return inner1

    def wrapper2(func):  # func = inner1

        def inner2():

            print('wrapper2 ,before func')  # 1

            func()  # inner1()

            print('wrapper2 ,after func')  # 5

        return inner2

    @wrapper2  # f = wrapper2(f) 里面的f新变量 = inner1 外面的f最新变量 = inner2

    @wrapper1  # f = wrapper1(f) 里面的f函数名  外面的f新变量=inner1

    def f():

        print('in f')  # 3

    f()  # inner2()

    '''

    wrapper2 ,before func

    wrapper1 ,before func

    in f

    wrapper1 ,after func

    wrapper2 ,after func

    '''

  • 相关阅读:
    CSS实现点击改变元素背景色
    php三种方法从控制结构或脚本中跳出
    如何关闭运行在某端口的的进程,例如 :8080端口
    Webpack简易入门教程
    git add -A 和 git add . 的区别
    怎样把已经做好的网页传到网上去?
    jquery源码之事件系统-- jQuery.event
    jquery源码之缓存系统--$.data
    jquery源码之延迟对象--Deferred
    jquery源码之低调的回调函数队列--Callbacks
  • 原文地址:https://www.cnblogs.com/dzh0394/p/9042650.html
Copyright © 2011-2022 走看看