zoukankan      html  css  js  c++  java
  • 第十一天——标准版装饰器(二)

    一. 标准版装饰器

    代码优化:语法糖

    根据我的学习,我们知道了,如果想要各给一个函数加一个装饰器应该是这样:

    def home(name,age):
        time.sleep(3)  # 模拟一下网络延迟以及代码的效率
        print(name,age)
        print(f'欢迎访问{name}主页')
    

    def timer(func): # func = home
    def inner(args,**kwargs):
    start_time = time.time()
    func(
    args,**kwargs)
    end_time = time.time()
    print(f'此函数的执行效率为{end_time-start_time}')
    return inner

    home = timer(home)
    home('太白',18)

    如果你想给home加上装饰器,每次执行home之前你要写上一句:home = timer(home)这样你在执行home函数 home('太白',18) 才是真生的添加了额外的功能。但是每次写这一句也是很麻烦。所以,Python给我们提供了一个简化机制,用一个很简单的符号去代替这一句话。

    def timer(func):  # func = home
        def inner(*args,**kwargs):
            start_time = time.time()
            func(*args,**kwargs)
            end_time = time.time()
            print(f'此函数的执行效率为{end_time-start_time}')
        return inner
    ​
    @timer  # home = timer(home)
    def home(name,age):
        time.sleep(3)  # 模拟一下网络延迟以及代码的效率
        print(name,age)
        print(f'欢迎访问{name}主页')
    ​
    home('太白',18)
    

    你看此时我调整了一下位置,你要是不把装饰器放在上面,timer是找不到的。home函数如果想要加上装饰器那么你就在home函数上面加上@home,就等同于那句话 home = timer(home)。这么做没有什么特殊意义,就是让其更简单化,比如你在影视片中见过野战军的作战时由于不方便说话,用一些简单的手势代表一些话语,就是这个意思。

    至此标准版的装饰器就是这个样子:

    def wrapper(func):
        def inner(*args,**kwargs):
            '''执行被装饰函数之前的操作'''
            ret = func
            '''执行被装饰函数之后的操作'''
            return ret
        return inner
    

    这个就是标准的装饰器,完全符合代码开放封闭原则。这几行代码一定要背过,会用。

    此时我们要利用这个装饰器完成一个需求:简单版模拟博客园登录。 此时带着学生们看一下博客园,说一下需求: 博客园登陆之后有几个页面,diary,comment,home,如果我要访问这几个页面,必须验证我是否已登录。 如果已经成功登录,那么这几个页面我都可以无阻力访问。如果没有登录,任何一个页面都不可以访问,我必须先登录,登录成功之后,才可以访问这个页面。我们用成功执行函数模拟作为成功访问这个页面,现在写三个函数,写一个装饰器,实现上述功能。

    login_status = {
        'username': None,
        'status': False,
    }
    

    def auth(func):
    def inner(*args,**kwargs):
    if login_status['status']:
    ret = func()
    return ret
    username = input('请输入用户名:').strip()
    password = input('请输入密码:').strip()
    if username '太白' and password '123':
    login_status['status'] = True
    ret = func()
    return ret
    return inner

    @auth
    def diary():
    print('欢迎访问日记页面')

    @auth
    def comment():
    print('欢迎访问评论页面')

    @auth
    def home():
    print('欢迎访问博客园主页')

    diary()
    comment()
    home()

    装饰器

    装饰器:

    在这里插入图片描述

    函数的执行流程:
    在这里插入图片描述

    有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。 想到与得到中间还有两个字——做到。
  • 相关阅读:
    uva 147 Dollars
    hdu 2069 Coin Change(完全背包)
    hdu 1708 Fibonacci String
    hdu 1568 Fibonacci
    hdu 1316 How Many Fibs?
    poj 1958 Strange Towers of Hanoi
    poj 3601Tower of Hanoi
    poj 3572 Hanoi Tower
    poj 1920 Towers of Hanoi
    筛选法——素数打表
  • 原文地址:https://www.cnblogs.com/huoxc/p/12845709.html
Copyright © 2011-2022 走看看