装饰器进阶

  • 函数的有用信息

    • 如何给函数添加注释
    • def func(*args,**kwargs):
          """
           这里是函数的注释,先写?下当前这个函数是?什么的
          :param args:参数args是什么意思
          :param kwargs:参数kwargs是什么意思
          :return:返回值是什么
          """
          print("哈哈")
    • 如何获取到函数的相关信息
    •   

      def func(*args,**kwargs):
          """
           这里是函数的注释,先写?下当前这个函数是?什么的
          :param args:参数args是什么意思
          :param kwargs:参数kwargs是什么意思
          :return:返回值是什么
          """
          print("哈哈")
      print(func.__name__) #获取函数的名字
      print(func.__doc__)  #获取函数的注释
      • 函数名._name_可以查看函数的名字
      • 函数名._doc_可以查看函数的文档注释
    • 被装饰器装饰之后的函数名
    • def wrapper(func):
          def inner(*args, **kwargs):
              ret = func(*args, **kwargs)
              return ret
          return inner
      # @wrapper 相当于target_func=wrapper(target_func)语法糖
      @wrapper
      def target_func():
          print("我是?标函数")
      # 调?目标函数
      target_func()
      print(target_func.__name__)     # inner 结果: inner 
    • 我虽然访问的是target_func函数,但是实际执行的是inner函数.这样就会给下游的程序带来困惑.我们需要修改函数信息.
    • from functools import wraps # 引?入函数模块
      #  装饰器:对传递进来的函数进?包装.可以在?
      def wrapper(func):
          @wraps(func)    # 使?函数原来的名字
          def inner(*args, **kwargs):
              ret = func(*args, **kwargs)
              return ret
          return inner #
      # @wrapper 相当于target_func=wrapper(target_func)语法糖
      @wrapper
      def target_func():
          print("我是?标函数") # 调??标函数
      target_func()
      print(target_func.__name__)     # 不再是inner.?是target_func了
    • *args和**kwargs
      • 接受参数的时候是聚合,参数声明
      • 传递参数的时候是打散,给函数传递实参
  • 装饰器传参
  • def outer(flag):
        def timer(func):
            def inner(*args,**kwargs):
                if flag:
                    print(‘‘‘执行函数之前要做的‘‘‘)
                re = func(*args,**kwargs)
                if flag:
                    print(‘‘‘执行函数之后要做的‘‘‘)
                return re
            return inner
        return timer
    
    @outer(False)
    def func():
        print(111)
    
    func()
    
    带参数的装饰器
  • 执行步骤: 先执行outer(False) 然后再@返回值.   返回值恰好是timer. 结果就是 @timer
  • 多个装饰器装饰同一个参数
  • def wrapper1(func):
        def inner():
            print(‘wrapper1 ,before func‘)
            func()
            print(‘wrapper1 ,after func‘)
        return inner
    
    def wrapper2(func):
        def inner():
            print(‘wrapper2 ,before func‘)
            func()
            print(‘wrapper2 ,after func‘)
        return inner
    
    @wrapper2
    @wrapper1
    def f():
        print(‘in f‘)
    
    f()
    
    多个装饰器装饰同一个函数
  • 执行顺序:首先@wrapper1装饰起来. 然后获取到一个新函数是wrapper1中的inner. 然后执行@wrapper2.这个时候. wrapper2装饰的就是wrapper1中的inner了.
  • 所以. 执行顺序就像:
  •     第二层装饰器前(第一层装饰器前(目标)第一层装饰器后)第二层装饰器后.
  • 程序从左到右执行起来. 就是我们看到的结果

原文地址:https://www.cnblogs.com/zxmbky/p/9188478.html

时间: 2024-08-02 14:14:08

装饰器进阶的相关文章

python函数四(装饰器进阶)

一.开放封闭原则 1.对扩展是开放的 任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新功能. 2.对修改是封闭的 比如我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户. 装饰器完美的遵循了开放封闭原则. 二.函数的有用信息 def func(): ''' 本函数主要用于绘图,实时接收数据 :return:返回给前端某标签 ''' print(func.__doc

Python函数--装饰器进阶

开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新功能. 2.对修改是封闭的 为什么要对修改封闭呢? 就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户. 装饰器完美的遵循了这个开放封闭原则. *args,**kwargs def f1(*args,**kwargs):   接

Python学习之装饰器进阶

函数知识回顾: 函数的参数分为:实参和形参. 实参:调用函数的时候传入的参数: 形参:分为3种(位置参数.默认参数.动态传参) 位置参数:必须传值 def aaa(a,b): print(a,b) aaa(1,2) 默认参数:不是必须传参数 def bbb(x=10): print(x) # bbb() #x = 10 # bbb(20) #x = 20 动态传参 def ccc(*args):#1,2,3,4,5 print(args) ccc(1,2,3,4,5)#按位置传参数 t = (1

十二、装饰器进阶

执行函数的时候* 打散 定义函数的时候* 聚合 from functools import wraps def wrapper(f): # f = func1 @wraps(f) def inner(*args,**kwargs): #聚合 #args (1,2,3) '''执行函数之前的相关操作''' ret = f(*args,**kwargs) # 打散 1,2,3 '''执行函数之后的相关操作''' return ret return inner # 函数的执行时,*打散. # 函数的定

第五章 装饰器进阶

1.对大批量函数添加装饰器,而且不定期的开关 # 多个装饰器,添加批量管理的开关 import time FLAG = False def outer(flag): def timer(f1): def inner(*args,**kwargs): if flag == True: start_time = time.time() ret = f1(*args,**kwargs) end_time = time.time() print('运行时间为 %s' % (end_time-start_

python 基础篇 12 装饰器进阶

本节主要内容:1. 通?装饰器回顾2. 函数的有?信息3. 带参数的装饰器4. 多个装饰器同时装饰?个函数 ?. 通?装饰器的回顾开闭原则: 对增加功能开放. 对修改代码封闭装饰器的作?: 在不改变原有代码的基础上给?个函数增加功能通?装饰器的写法: 执行过程: 其实执行  target_func()就是执行inner函数.  inner函数会先执行目标函数之前的代码,然后执行目标函数,之后再执行目标函数之后的代码. 如何获取函数的有用信息: 函数名.__name__可以查看函数名字 函数名._

19 装饰器进阶

#复习装饰器 def wrapper(func): def inner(*args,**kwargs): print('在此添加调用前代码') ret = func(*args,*kwargs) print('在此添加调用后代码') return ret return inner @wrapper def holiday(day): print('全体放假 %s 天' % day) return '好开心' ret = holiday(3) print(ret) ''' 在此添加调用前代码 全体

装饰器进阶2

#带参数的装饰器 #通过装饰器控制多个函数 import time FLAGE = False def timmer_out(flag): def timmer(func): def inner(*args,**kwargs): if flag: start = time.time() ret = func(*args,**kwargs) end = time.time() print(end-start) return ret else: ret = func(*args, **kwargs)

Python_装饰器进阶_32

#带参数的装饰器 #500个函数 import time FLAGE = True def timmer_out(flag): def timmer(func): def inner(*args,**kwargs): if flag: start = time.time() ret = func(*args,**kwargs) end = time.time() print(end-start) return ret else: ret = func(*args, **kwargs) retur