一、装饰器的作用
在不改动原函数及其的调用方式的情况下,在原来函数的前后调节功能。
二、装饰器固定模式(最完善的)
def wrapper(fun):
def extended(*args,**kwargs): #可接受任意参数
'''操作'''
ret = fun(*args,**kwargs) #调用原函数并传相应的参数和返回结果
'''操作'''
return ret
return extended
@wrapper
def function():
pass
三、装饰器完善过程
1.简单的装饰器
import time
def function(): #被修饰的函数
print("hello world!")
def run_time(fun): #装饰器
def extend():
start = time.time()
fun() #原函数的调用
end = time.time()
return end-start
return extend
function = run_time(function) #将原函数名指向扩展函数
time = function()
print(time)
2.装饰器完善-----返回值
def func():
return (1,5,64,8)
def wrapper(fun):
def extend():
ret = fun() #用一个变量接收
return ret #返回原函数的返回值
return extend
func = wrapper(func)
func()
3.装饰器完善----参数
def reader(path,mode="r"):
pass
def writer(path,permission,mode="w",long=1024):
pass
#由于函数的参数多变,考虑用动态参数。
def wrapper(fun):
def extend(*args,**kwargs): #args接收位置参数,kwargs接收默认参数。
ret = fun(*args,**kwargs) #*args **kwargs 打散分别传参。
return ret
return extend
reader = wrapper(reader)
writer = wrapper(writer)
reader()
writer()
4.装饰器完善-----reader = wrapper(reader)-------》语法糖@
def wrapper(fun):
def extend(*args,**kwargs):
ret = fun(*args,**kwargs)
return ret
return extend
#语法糖:@ 用法:下面必须紧接着被装饰的函数,装饰器函数写在前面
@wrapper #@wrapper相当于reader = wrapper(reader)
def reader(path,mode="r"):
pass
@wrapper #@wrapper相当于writer = wrapper(writer)
def writer(path,permission,mode="w",long=1024):
pass
reader()
writer()