zoukankan      html  css  js  c++  java
  • 装饰器

    致命三连他来了

    什么是装饰器?装饰器的作用?怎么使用装饰器?

    装饰器:装饰的工具

    装饰器必须遵守“开放封闭”的原则

      开放:

        对函数功能的添加是开放的

      封闭:

        对函数功能的修改时封闭的

    装饰器的作用:

      在不修改被装饰对象源代码与调用方式的前提下,添加新的功能

    怎么用装饰器?

    比如统计时间,登录认证

    # 装饰器终极版
    def wrapper(func):
        def inner(*args,**kwargs):              # 接受用户输入的值
            star_time = time.time()             # 记录当前时间
            res = func(*args,**kwargs)          # 接受被装饰函数的返回值
            end_time = time.time()
            print(res)                          # 打印res的内容
            print(f'消耗下载时间{end_time - star_time}')
            return res
        return inner
    @wrapper                                    # 语法糖
    def func1(url):
        print(f'{url}电影下载开始')
        time.sleep(1)                           # 等待一秒
        print(f'{url}电影下载结束')
        return '魔童降世.mp4'
    func1('www.baidu.com')                      # 用户输入
    
    # 打印结果:
    # www.baidu.com电影下载开始
    # www.baidu.com电影下载结束
    # 魔童降世.mp4
    # 消耗下载时间1.0004057884216309

    装饰器的语法糖

    @装饰器(函数)

    被装饰对象的源代码

    注意:在使用装饰器语法糖时,装饰器必须在被装饰对象之前

    装饰器的好处

    解决代码冗余问题,提高代码的可扩展性

     叠加装饰器

    叠加装饰器就是在同一个被装饰对象中,添加多个装饰器,并执行

    装饰顺序:从下到上

    执行顺序:从上到下

    PS:装饰器在调用被装饰对象时才会执行

      无论inner中出现任何判断,最后都要返回“调用后的被装饰对像”func(*arge,**kwargs)

    上边说的都是无参装饰器

    装饰器还分为有参装饰器

    应用于在某些时候,我们需要给用户的权限进行分类

  • 相关阅读:
    OpenNebula Restfull 接口请求示例
    [c++]堆和栈的区别
    [c++]程序的内存划分理解
    设计原则 依赖倒置
    设计原则 里氏替换原则
    设计原则:单一职责原则
    WPF 使用附加属性增加控件属性
    WPF 使用依赖属性自定义控件
    WPF EventAggregator(基于EventAggregator的事件发布及订阅)
    Struts2 Validate
  • 原文地址:https://www.cnblogs.com/aheng/p/11842764.html
Copyright © 2011-2022 走看看