装饰器函数的有用信息
装饰器的有用信息 三个引号一回车 def login(): """ :return: """ 写入备注: def login(username,password): """ 此函数需要用户名,密码两个参数,完成的是登录的功能。 :return: Ture登录成功。 False登录失败。 """ print('登录成功...') return True login(1,2) 打印信息: def login(username,password): """ 此函数需要用户名,密码两个参数,完成的是登录的功能。 :return: Ture登录成功。 False登录失败。 """ print('登录成功...') return True login(1,2) 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: Ture登录成功。 False登录失败。 ''' print('登录成功..') return True print(login.__name__) print(login.__doc__) from functools import wraps
import time flag = True def timer(f): def inner(*args,**kwargs): if flag: star_time = time.time() time.sleep(0.3) ret = f(*args,**kwargs) end_time = time.time() print('执行效率%s'%(end_time-star_time)) return ret return inner() @timer def func1(): print(111) @timer def func2(): print(222) @timer def func3(): print(333)
面试题:(,报错原因)
1, count = 1 def func1() print(count) func1 #局部作用域可以对全局作用域的变量进行引用。 count = 1 2,**** count = 1 函数内部如果有变量名与全局变量名相同且对此变量进行改变, python就会将你引用的那个变量视为局部定义的变量,但是局部没定义, 则他会报错。 def func1(): count = count + 1 print(count) func1() 3, flag = True def func1(): if flag: print(333) global flag flag = False func1() 4, flag = True while flag: print(333) flag = False print(222) for if while 没有开辟临时空间。 5, count = 1 def func4(): count = count + 1 print(count) func4() #局部只能引用全局的变量,不能修改,如果要修改global. 结果会报错,因为赋值浅引用的全局变量count分不清是修改的还是引用的 6,函数中如果使用global + 变量 必须是第一次使用这个变量。 flag = True def func1(): if flag: print(333) global flag flag = False func1()
带参数的装饰器:
import time def timer_out(flag1): 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 = True @timer_out(flag) def func1(): print(111) @timer_out(flag) def func2(): print(222) @timer_out(flag) def func3(): print(333) func1() func2() func3()
带参数装饰器默写:
def outer(flag): def timer(func): def inner(*args,**kwargs): if flag: print('''执行函数之前要做的''') re = func(*args,**kwargs) if flag: print('''执行函数之后要做的''') return re return inner return timer @outer(False) def func(): print(111) func()
多个装饰器装饰一个函数:
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 fmunc') # 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()
多个装饰器装饰一个函数默写
def wrapper1(fn): def inner(*args,**kwargs): print('11执行目标函数之前的操作') ret = fn(*args,**kwargs) print('11执行目标函数之后的操作') return ret return inner def wrapper2(fn): def inner(*args,**kwargs): print('22执行目标函数之前的操作') ret = fn(*args,**kwargs) print('22执行目标函数之后的操作') return ret return inner @wrapper2 #用[ ]表示 @wrapper1 #用( )表示 def func(): print('333') #目标 func() [ ( 目标 )] : 从左到右依次执行 #####哪个装饰器在最上边,执行的时候就在最外边(谁在最上边,谁在最外边) 22执行操作之前 11执行操作之前 333 11执行操作之后 22执行操作之后
posted on 2018-05-29 21:45 liangliang123456 阅读(115) 评论(0) 编辑 收藏 举报