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

    装饰器原理

    闭包及性质

    • 函数的嵌套
    • 内嵌函数可访问外层函数的变量

    装饰器实现

    • 函数作为参数传递到装饰函数中
    • 利用闭包特性,对需装饰的函数进行装饰
    • 返回装饰结束的函数
    • “ @ ”为装饰器的语法糖

    普通装饰器

    • 适用于给已有的代码添加一点新功能

    • 有一个回家函数 go_home

      def go_home():
          print("回家了!!!")
      go_home()
      >>>回家了!!!
      
    • 在回家之前去搞个苹果

      def get_apple(func):
          def f():
              print("买了个苹果!")
              func()
          return f
      @get_apple
      def go_home():
          print("回家了!!!")
      go_home()
      >>>买了个苹果!
      >>>回家了!!!
      

    装饰带返回值的函数

    • 有一个回家函数 go_home

      def go_home():
          return "回家了!!!"
      ret = go_home()
      print(ret)
      >>>回家了!!!
      
    • 在回家之前去搞个苹果

      def get_apple(func):
          def f():
              print("买了个苹果!")
              ret = func()
              return ret
          return f
      @get_apple
      def go_home():
          return "回家了!!!"
      ret = go_home()
      print(ret)
      >>>买了个苹果!
      >>>回家了!!!
      

    装饰带参数的函数

    • 有一个回家函数 go_home

      def go_home(mood):
          print(mood+"的回家了!!!")
      go_home(“高高兴兴”)
      >>>高高兴兴的回家了!!!
      
    • 在回家之前去搞个苹果

      def get_apple(func):
          def f(*args, **kwargs):
              print("买了个苹果!")
              func(*args, **kwargs)
          return f
      
      @get_apple
      def go_home(mood):
          print(mood+"的回家了!!!")
      go_home(“高高兴兴”)
      >>>买了个苹果!
      >>>高高兴兴的回家了!!!
      

    带参数的装饰器

    • 面对不同的函数装饰效果需要不同,就可以给装器加上参数
    def get_apple(apple="苹果"):
        def f1(func):
            def f2():
                print("买了个"+apple)
                func()
            return f2
        return f1
    
    @get_apple("红红的苹果")
    def go_home():
        print("回家了!!!")
    
    @get_apple("烂苹果")
    def gift():
        print("送给坏人!!!")
        
    go_home()
    gift()
    
    >>>买了个红红的苹果
    >>>回家了!!!
    >>>买了个烂苹果
    >>>送给坏人!!!
    

    多个装饰器装饰同一个函数

    • 对函数加装多个功能
    def flower(func):
        def f():
            print("买朵玫瑰")
            func()
        return f
    
    def get_apple(func):
        def f():
            print("买个苹果")
            func()
        return f
    
    @flower
    @get_apple
    def go_home():
        print("回家送给对象!")
    
    go_home()
    
    >>>买朵玫瑰
    >>>买个苹果
    >>>回家送给对象!
    
  • 相关阅读:
    gnome3 修改桌面背景图片模式
    记录openSUSE 源码安装node.js
    [转]gnome环境中将家目录下预设的文件夹由中文名称改为英文名称
    Clover config.plist Boot部分
    bootstrap table 实现固定悬浮table 表头并可以水平滚动
    openSUSE 安装compass,mkmf.rb can't find,checking for ffi.h...extconf.rb failed
    读《深入PHP 面向对象、模式与实践》笔记
    openSUSE中启用apache mod_rewrite
    openSUSE安装Composer
    openSUSE 安装LAMP记录
  • 原文地址:https://www.cnblogs.com/QX-Tang/p/11523416.html
Copyright © 2011-2022 走看看