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

'''

posted on 2018-05-15 19:19  kindle86  阅读(111)  评论(0编辑  收藏  举报

导航