看代码:
def fun1(f):
def fun2(*args):
f(*args)
return fun2
@fun1
def add(a,b):
return a+b
这个代码意思我已经理解了
我只是不理解为什么要这么写.
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>
>>> f()
25
这个东西叫做装饰器,装饰器的基本逻辑是闭包,不是为了调用内函数而这样写,实际上是为了在不改变原函数逻辑功能的情况下添加新功能
就基础而言,最常用来举例的是计算函数的运行时间,在内函数的前后可以添加打印时间、计算花费时间的代码
那想要计算时间的时候直接调用装饰器就可以了,不想计算的时候注释掉这一行,这样会更简便
def fun1(f):
#可添加其他功能代码
def fun2(*args):
f(*args)
#可添加其他功能代码
return fun2
@fun1
def add(a,b):
return a+b
你就不知道他有啥用.
作用:
import requests
from time import sleep
def retry(cishu = 1):
'''
闭包我知道的最多三层,最外层传递装饰器参数(这一层可以不写)
中间层传递被装饰器装饰的函数,这里相当于get()
内层传递被装饰器装饰函数的参数,这里是get()的参数a
装饰器作用:限制request重复请求的次数
'''
def outer(func):
def inner(x):
print(f'inner获取到了get参数:{x}')
num = 1
for i in range(cishu):
try:
func(x)
break
except:
print(f'第{num}次尝试失败')
sleep(1)
num += 1
return inner
return outer
@retry(cishu=3)
def get(a):
print(f'get的参数是{a}')
# 网址错误,所以获取不到数据,会报错
print(requests.get('https://baiduuu.com'))
get(333)
装饰器的作用之一就是在不改变原来代码的基础上增加新的功能,比如你写了个登陆的功能。没有验证码直接账号密码登陆,现在想添加验证码 此时就可以使用装饰器进行装饰实现这个功能