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

    装饰器 -面试必需品

    • 不想修改函数的调用方式,但是还想在原来函数前后添加功能
      • 装饰器实际运行模式的模拟
      import time
      
      #定义被装饰的函数
      def func():
          print('我测试函数的运行速度')
          
      #定义装饰器,必须是闭包
      def timer(f):
          def func():
              start = time.time()
              time.sleep(1)
              f()
              end = time.time()
              print(end - start)
          return func
      #调用
      func = timer(func)  
      func()  让其看起来像是直接调用的函数func达到测试时间的效果
      
    • 语法糖
      • 真正使用装饰器
      import time
      
      #定义装饰器
      def timer(f):
          def func():
              start = time.time()
              time.sleep(1)
              f()
              end = time.time()
              print(end - start
          return func
          
      @timer  #采用装饰器的效果
      def func():
          print('我测试函数的运行速度')
      #调用
      #func = timer(func)  这句话直接用 @装饰器名 代替
      func()  #采用装饰器后直接调用原函数就行
      

    装饰器的形成过程

    • 最简单的>>有返回时的>>有一个参数的>>万能参数

    装饰器的作用

    原则:开放封闭原则

    • 开放
      • 对扩展是开放的,函数对外扩展是开放的
    • 封闭
      • 对修改是封闭的,函数一但定义并确认不能轻易的修改或者不修改

    装饰器的固定模式

    • 装饰器实际是调用装饰器内部函数
    #定义装饰器
    def wrapper(f): #f是被装饰的函数
        def inner(*args, **kwargs): 
            '''执行被装饰的函数之前需要执行的'''
            ret = f(*args, **kwargs)
            '''执行被装饰的函数之后需要执行的'''
            return ret
        return inner
        
    @wrapper  #调用装饰器
    def func()  
        pass
    #调用
    func()  #实际上是调用inner()
    
  • 相关阅读:
    c++的一些个学习及总结
    简单回合制游戏流程
    c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind
    二叉搜索树、平衡二叉树、红黑树
    STL之空间配置器
    centos 7 安装mysql及常用操作
    生产服务器问题定位
    Linux常用命令
    Garbage First(G1) 垃圾收集器
    垃圾回收算法和垃圾收集器
  • 原文地址:https://www.cnblogs.com/liliudong/p/9572742.html
Copyright © 2011-2022 走看看