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