装饰器

2层装饰器不加参数
 def async(f):
     def wrapper(*args, **kwargs):
         thr = Thread(target=f, args=args, kwargs=kwargs)
         thr.start()
     return wrapper
 @async
 def a():
     print("123")
装饰器就是将你要装饰的函数放到了你写的装饰器里面执行,如果不return的话,被装饰的函数的return就不会被返回装饰器return
带参数的装饰器
def logging(level):
    def wrapper(func):
        def inner_wrapper(*args, **kwargs):
            print ("[{level}]: enter function {func}()".format(
                level=level,
                func=func.__name__))
            return func(*args, **kwargs)
        return inner_wrapper
    return wrapper

@logging(level='INFO')
def say(something):
    print ("say {}!".format(something))

# 如果没有使用@语法,等同于
# say = logging(level='INFO')(say)

@logging(level='DEBUG')
def do(something):
    print ("do {}...".format(something))

if __name__ == '__main__':
    say('hello')
    do("my work")
最外面的return是返回所有

没有最外面的return的时候

def modify(func):
    def injob():
        print("正在执行扩展功能")
        return func()
    # return injob()
@modify
def func1():
    print("func 正在执行")
    return 'result'

结果是
在这里插入图片描述
有return的结果

def modify(func):
    def injob():
        print("正在执行扩展功能")
        return func()
    return injob()
@modify
def func1():
    print("func 正在执行")
    return 'result'

在这里插入图片描述

案例

添加时间装饰器,控制采集频率
    def desc_time(s):
        def wapper(func):
            name = func.__name__  # 给变量name赋值 确定访问的函数
            func_identify = {name: 0, 'second': s}

            def inner(*args, **kwargs):
                use_time = func_identify[name] + func_identify['second']  # 需等待这些时间之后才可以再次访问

                now_time = time.time()
                re_time = use_time - now_time  # 这个结果是一个负数
                if now_time > use_time:  # 如果当前时间大于等待的时间
                    res = func(*args, **kwargs)
                    func_identify[name] = now_time  # 给 func_identify[name] 重新赋值
                else:
                    print("请在{}之后访问".format(re_time))
                    time.sleep(re_time)
                    res = func(*args, **kwargs)
                return res

            return inner

        return wapper
    @desc_time(random.randint(2,5))
    def getData(self,url):
    	s = requests.Session()
    	data = s.get(url)
    	return data
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值