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

    装饰器

    • 什么是装饰器

      装饰器指的是为被装饰对象添加新功能的工具

      装饰器本身可以是任意可调用对象

      被装饰对象本身也可以是任意可调用对象

    • 为什么要用装饰器

      开放封闭原则:对修改封闭,对扩展开放

      装饰器的实现原则:

      1. 不能修改被装饰对象的源代码

      2. 不能修改被装饰对象的调用方式

      装饰器的目的:

      就是在遵循原则1和原则2的原则的条件的情况下实现为被装饰对象添加新功能。

    • 怎么用装饰器

      # 装饰器的基本框架
      def outer(func):
          def wrapper(*args, **kwargs):  # 设置可变形参可以接收任意值
              # 此处可以添加装饰内容(添加新功能)
              res = func(*args, **kwargs)
              # 此处可以添加装饰内容(添加新功能),即被装饰对象前后皆可添加功能语句
              return res  # 返回被装饰对象的值,保证与被装饰对象功能的一致性
          return wrapper
          
          
      @outer  # 语法糖,本质上是将outer(func1)的内存地址绑定给新的func1,func1 = outer(func1)
      def func1():
          pass
              
              
      func()  # 调用函数,此时的函数就是被装饰过的函数

      语法糖:在被装饰对象正上方加入@装饰器名称

    • 装饰器使用实例

      1. 实例1

    # 实现在被装饰对象基础上添加计时功能
    import time
    ​
    def timer(func):
        def wrapper(*args, **kwargs):
            t1 = time.time()  # 记录被装饰对象执行前时间
            res = func(*args, **kwargs)
            t2 = time.time()  # 被装饰对象执行完时间
            print(t2 - t1)
            return res
        return wrapper
        
        
    @timer
    def welcome():
        time.sleep(2)
        print('welcome to China')
        
        
    welcome()
    1. 实例2

    # 给被装饰对象添加登录认证功能
    def login(func):
        def wrapper(*args, **kwargs):
            while True:
                name = input("input your name:").strip()
                pwd = input("input your password:").strip()
                if name == 'Jason' and pwd == '123':
                    res = func(*args, **kwargs)
                    return res
                else:
                    print("name or password error!")
        return wrapper          
    ​
    @login
    def welcome(name):
        print("welcome %s to China !" % name)
        
    ​
    welcome('Jason')
     
  • 相关阅读:
    jQuery1.3.2 源码学习 2 两个重要的正则表达式
    学习 jQuery 4 使用方法选择
    学习 jQuery 6 在 TreeView 中实现全选
    jQuery1.3.2 源码学习4 init 函数分析 2
    学习 jQuery 3 选择器
    学习 jQuery 5 筛选和过滤器
    条款9:在删除选项中仔细选择
    优化3D图形流水线
    指针相减
    浅谈水体的实现
  • 原文地址:https://www.cnblogs.com/liusijun113/p/10041927.html
Copyright © 2011-2022 走看看