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()

    装饰器

    装饰器:

    在这里插入图片描述

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

    有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。 想到与得到中间还有两个字——做到。
  • 相关阅读:
    线程的中断.interrupt
    线程的加入.join()
    Runnable接口
    线程Thread类
    求和、均值
    最值、对应索引位置
    数组、冒泡排序
    获取Methods成员方法类
    获取Field成员变量类
    基于WinDbg的内存泄漏分析
  • 原文地址:https://www.cnblogs.com/huoxc/p/12845709.html
Copyright © 2011-2022 走看看