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()
    
    >>>买朵玫瑰
    >>>买个苹果
    >>>回家送给对象!
    
  • 相关阅读:
    STM32概述
    对xlslib库与libxls库的简易封装
    Makefile.am编写规则
    linux下使用autoconf制作Makefile
    python 登录三次禁止登录
    Linux -- gpasswd
    Linux -- userdel
    Linux -- groupmod
    Linux -- groupadd
    Linux -- passwd
  • 原文地址:https://www.cnblogs.com/QX-Tang/p/11523416.html
Copyright © 2011-2022 走看看