python-装饰器
函数继续更新中......
小插曲,昨天在编程中
str = '1,2,3' tup_1 = (1,2,3) if isinstance(tup_1[0].str): print('是字符串类型') #运行后报错,原因之前定义了str,没有注意到全局变量与局部变量的关系 #TypeError: isinstance() arg 2 must be a type or tuple of types
#获取str对像的属性和方法
>>>dir('ABC')
装饰器的形成:
简单的装饰器:import time
import time def func_1(): time.sleep(0.1) print('aaaa') def timer(f): def inner(): start = time.time() f() end = time.time() print(end - start) return inner func_1 = timer(func_1) func_1()
使用time()模块 import time def timer(f): start = time.time() f() end = time.time() print(end-start) def func_1(): time.sleep(0.1) print('aaaaa') timer(func_1)
装饰器的作用:
不能修改函数的调用方式
但还想在原来的函数前后添加功能
timmer就是一个装饰器函数,只是对一个函数有一些装饰作用
语法糖:
import time def timer(f): def inner(): start = time.time() f() #被装的函数 end = time.time() print(end - start) return inner #@timmer 相当于func_1 = timer(func_1) @timmer #语法糖,在函数上方 @装饰器函数名 def func_1(): time.sleep(0.1) print('aaaa') func_1()
语法糖@ 相当于调用
def func_A(args): print('A') a = args() return @funcA def func_B(): print('B') $A $B
接装饰器,调用方法添加返回值
import time @timmer #语法糖 @装饰器函数名 def func_1(): time.sleep(0.1) print('aaaa') * return '新年好' def timer(f): def inner(): start = time.time() * ret = f() #被装饰的函数 end = time.time() print(end - start) * return ret return inner #func_1 = timer(func_1) f = func_1()
插曲
def outer(): def inner(): return 'inner' inner() outer() #没有返回值 None #分析原因:outer()函数内部调用inner(),跳转至inner()方法返回值'inner' 但outer()函数本身没返回值不能接收inner()返回的变量,所以返回None
装饰器,为原函数添加1个及多个参数
@timer #语法糖 @装饰器函数名 *def func_1(a,b): time.sleep(0.1) print('aaaa',a,b) return '新年好' def timer(f): #被装的函数 def inner(*args,**kwargs): start = time.time() * ret = f(*args,**kwargs) 这里的*代表打散做用,f是被修饰的函数 end = time.time() print(end - start) return ret return inner #func_1 = timer(func_1) *f = func_1(a)
装饰器的固有模式
def wrapper(func): def inner(*args,**kwargs): ret = func(*args,**kwargs) return ret return inner