18-装饰器【进阶】

尝试:装饰器分为有参数无参数,装饰器就是闭包的使用

注:关于闭包:在17-python知识点补充【小知识,面试中可能会考】中第17个小点

补充:软件上新后,我们需要:不修改源代码、不修改调用方式,在此基础上扩展新功能。

#常见的装饰器的形式
def outter(func):
    def wrapper(*args,**kwargs):
        res=func(*args,**kwargs)
        return res
    return wrapper

常见装饰器:

1、计时装饰器:

#计时装饰器
import time
def timmer(func):
    def wrapper(*args,**kwargs):
        start=time.time()
        res=func(*args,**kwargs)
        stop=time.time()
        spend=stop-start
        print('花费时间{}'.format(round(spend,4)))
        return res
    return wrapper

@timmer  #使得下面的函数名当做参数传给装饰器  等价于  index=timmer(index)
def index():
    time.sleep(3)
    print('welcome to index page!')
    return 123
print(index())

@timmer   #使得下面的函数名当做参数传给装饰器  等价于  home=timmer(home)
def home():
    time.sleep(3)
    print('welcome to my home page!')
    return 456
print(home())

结果显示:

welcome to index page!
花费时间3.0
123
welcome to my home page!
花费时间3.0001
456

2、认证装饰器

#认证装饰器
import time
def auth(func):
    name=input('请输入姓名:').strip()
    pwd=input('请输入密码:').strip()
    def wrapper(*args,**kwargs):
        if name=='psy' and pwd=='123':
            print('登陆成功,正在加载内容~~~')
            time.sleep(3)  #延迟,假装数据加载
            res=func(*args,**kwargs)
            return res
        else:
            print('登录失败')
    return wrapper

@auth  #等价于index=auth(index)
def index():
    time.sleep(1)
    print('welcome to indec page!')
    return 123
print(index())

结果显示:

请输入姓名:psy
请输入密码:123
登陆成功,正在加载内容~~~
welcome to indec page!
123

3、装饰器叠加使用【将计时器、认证器叠加使用】

注:==》计时器的时间【与两者位置摆放有关!】

#首先写好计时器和认证器

import time
def timmer(func):  #计时器
    def wrapper(*args,**kwargs):
        start=time.time()
        res=func(*args,**kwargs)
        stop=time.time()
        spend=stop-start
        print('花费时间{}'.format(round(spend,4)))
        return res
    return wrapper

def auth(func):  #认证器
    name=input('请输入姓名:').strip()
    pwd=input('请输入密码:').strip()
    def wrapper(*args,**kwargs):
        if name=='psy' and pwd=='123':
            print('登入成功,正在缓冲!')
            time.sleep(2)
            res=func(*args,**kwargs)
            return res
        else:
            print('登录失败!')
    return wrapper

(1)计时器在上,认证器在下

@timmer   #此时计时器统计的是:auth和index的时间
@auth
def index():
    time.sleep(3)
    print('welcom to index page!')
    return 123
print(index())

结果显示:

请输入姓名:psy
请输入密码:123
登入成功,正在缓冲!
welcom to index page!
花费时间5.0008
123

(2)计时器在下,认证器在上

@auth
@timmer  #此时计时器统计的是index的时间
def index():
    time.sleep(3)
    print('welcom to index page!')
    return 123
print(index())

结果显示:

请输入姓名:psy
请输入密码:123
登入成功,正在缓冲!
welcom to index page!
花费时间3.0009
123

注:装饰器的位置不同,可能导致出现的结果不同!!!

转载于:https://my.oschina.net/pansy0425/blog/3026896

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值