十二、裝飾器進階
阿新 • • 發佈:2018-04-27
from class sta ont -s turn 定義函數 str else
執行函數的時候* 打散
定義函數的時候* 聚合
from functools import wraps def wrapper(f): # f = func1 @wraps(f) def inner(*args,**kwargs): #聚合 #args (1,2,3) ‘‘‘執行函數之前的相關操作‘‘‘ ret = f(*args,**kwargs) # 打散 1,2,3 ‘‘‘執行函數之後的相關操作‘‘‘ return ret return inner # 函數的執行時,*打散。 # 函數的定義時,*聚合。 @wrapper # func1 = wrapper(func1) func1 = inner def func1(*args): #args (1,2,3) print(666) return args print(func1(*[1,2,3])) # inner(1,3,5) 打散
打印函數有用信息
@wrapper
def func1():
"""
此函數是完成登陸的功能,參數分別是...作用。
:return: 返回值是登陸成功與否(True,False)
"""
print(666)
return True
func1()
print(func1.__name__)
print(func1.__doc__)
#666
func1
此函數是完成登陸的功能,參數分別是...作用。
: return: 返回值是登陸成功與否(True,False)
帶參數的裝飾器
import time
def timmer(*args,**kwargs):
def wrapper(f):
def inner(*args,**kwargs):
if flag:
start_time = time.time()
ret = f(*args,**kwargs)
time.sleep(0.3)
end_time = time.time()
print(‘此函數的執行效率%f‘ % (end_time-start_time))
else:
ret = f(*args, **kwargs)
return ret
return inner
return wrapper
flag = False
@timmer(flag,2,3) # 兩步:1,timmer(flag) --> wrapper 2,@wrapper 裝飾器
def func1():
print(666)
@timmer(flag)
def func2():
print(777)
func1()
func2()
多個裝飾器裝飾一個函數
def wrapper1(func): f = func
def inner1():
print(‘wrapper1 ,before func‘)
func()
print(‘wrapper1 ,after func‘)
return inner1
def wrapper2(func): func = inner1
def inner2():
print(‘wrapper2 ,before func‘)
func()
print(‘wrapper2 ,after func‘)
return inner2
@wrapper2 然後讀@wrapper2 f = inner2
@wrapper1 先讀@wrapp1 f = inner1
def f():
print(‘in f‘)
f() 再讀f()
十二、裝飾器進階