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

浙公网安备 33010602011771号