函数的有用信息 带参数的装饰器 多个装饰器装饰一个函数

01,函数的有用信息。
login.__name__ : 显示函数名
login.__doc__ : 显示注释 内容
 
# def login(username, password):
#     """
#     此函数需要用户名,密码两个参数,完成的是登录的功能。
#     :return: True 登录成功。 False登录失败。
#     """
#     # print(login.__name__)
#     # print(login.__doc__)
#     print('登录成功...')
#     return True
#
# print(login.__name__)
# print(login.__doc__)

如果是装饰器 的话

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__)


02,带参数的装饰器
# 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()


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

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


03,多个装饰器装饰一个函数。
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
 
原文地址:https://www.cnblogs.com/HoneyTYX/p/9041672.html