资讯专栏INFORMATION COLUMN

Python Decorator装饰器的创建方法及常用场景分析

89542767 / 360人阅读

  小编写这篇文章的一个主要目的,主要是来给大家详细解答一些关于Python Decorator的相关知识,涉及到的内容主要是关于装饰器的一些介绍,比如,装饰器的一些常见创建方法,还有一些具体的场景,下面就给大家详细解答下。


  前言


  1.装饰器本质是一个语法糖,是对被装饰方法或类进行的功能扩充,是一种面向切面的实现方法


  2.装饰器可以分成方法装饰器和类装饰器,他们的区别是一个是用函数实现的装饰器,一个是用类实现的装饰器,他们也都能在方法和类上进行装饰


  3.类装饰器看起来结构更加清晰,因此下面的代码实现的装饰器全是类装饰器


  一、创建方式


  1.创建“装饰方法”的类装饰器


  from functools import wraps
  #装饰器类
  class MyDecorator(object):
  def __init__(self,plusNum):
  self.plusNum=plusNum#装饰器入参
  def __call__(self,func):
  wraps(func)#wraps保证装饰器不改变被装饰方法的原有函数结构
  def wrapped_function(*args,**kwargs):
  #调用被装饰方法前执行一些操作---------------
  #如果不加wraps,此处打印结果将是
  funcName=func.__name__
  print("funcName:{}".format(funcName))
  #---------------------------------------
  #修改被装饰方法的入参--
  num1=args[0]+2
  num2=args[1]+3
  args=(num1,num2)
  #-------------------
  #执行被装饰方法-------------
  res=func(*args,**kwargs)
  #-------------------------
  #调用被装饰方法后执行一些操作-------------
  print("do something after the func...")
  #-------------------------------------
  #修改被装饰方法的出参--
  res+=self.plusNum
  #-------------------
  #返回被装饰方法的参数
  return res
  #返回装饰器方法
  return wrapped_function
  #被装饰的方法
  MyDecorator(3)
  def add(num1,num2):
  return num1+num2
  if __name__=='__main__':
  #整体执行流程:
  #1.打印add方法名
  #2.修改被装饰方法入参
  #3.执行被装饰方法
  #4.调用被装饰方法后执行一些操作
  #5.修改被装饰方法的出参
  #6.打印结果
  print(add(5,3))
  #funcName:add
  #do something after the func...
  #16


  2.创建“装饰类中方法”的类装饰器


  from functools import wraps
  #装饰器类
  class MyDecorator(object):
  def __init__(self,plusNum):
  self.plusNum=plusNum#装饰器入参
  def __call__(self,func):
  wraps(func)#wraps保证装饰器不改变被装饰方法的原有函数结构
  def wrapped_function(*args,**kwargs):
  #此处与直接装饰方法相同
  #调用被装饰方法前执行一些操作---------------
  #如果不加wraps,此处打印结果将是
  funcName=func.__name__
  print("funcName:{}".format(funcName))
  #---------------------------------------
  #此处需要注意,如果需要修改入参的值,那么传参的索引是从1开始而不是从0开始,因为第一个入参的值是实例本身self
  #修改被装饰方法的入参--
  num1=args[1]+2
  num2=args[2]+3
  args=(args[0],num1,num2)
  #-------------------
  #此处与直接装饰方法相同
  #执行被装饰方法-------------
  res=func(*args,**kwargs)
  #-------------------------
  #此处与直接装饰方法相同
  #调用被装饰方法后执行一些操作-------------
  print("do something after the func...")
  #-------------------------------------
  #此处与直接装饰方法相同
  #修改被装饰方法的出参--
  res+=self.plusNum
  #-------------------
  #返回被装饰方法的参数
  return res
  #返回装饰器方法
  return wrapped_function
  class Operation(object):
  #被装饰的类方法
  MyDecorator(3)
  def add(self,num1,num2):
  return num1+num2
  if __name__=='__main__':
  op=Operation()
  print(op.add(3,5))
  #funcName:add
  #do something after the func...
  #16

  3.创建“装饰类”的类装饰器


  from functools import wraps
  #装饰器类
  class MyDecorator(object):
  def __init__(self,plusNum):
  self.plusNum=plusNum#装饰器入参
  def __call__(self,Cls):
  wraps(Cls)#wraps保证装饰器不改变被装饰类的原有结构
  def wrapped_function(*args,**kwargs):
  #调用被装饰类前执行一些操作---------------
  #如果不加wraps,此处打印结果将是
  clsName=Cls.__name__
  print("clsName:{}".format(clsName))
  #---------------------------------------
  #修改被装饰类的入参---
  num1=args[0]+2
  num2=args[1]+3
  args=(num1,num2)
  #-------------------
  #初始化被装饰类-------------
  cls=Cls(*args,**kwargs)
  #-------------------------
  #初始化后执行一些操作--------------------
  print("do something after the func...")
  #-------------------------------------
  #给类实例增加增加属性和方法---------------------
  cls.mul=3#增加属性
  cls.plusNumber=self.plusNumber#增加方法
  #-------------------------------------------
  #返回实例
  return cls
  #返回装饰器方法
  return wrapped_function
  def plusNumber(self,num):
  return num+self.plusNum
  #被装饰的类
  MyDecorator(3)
  class Operation(object):
  def __init__(self,num1,num2):
  self.num1=num1
  self.num2=num2
  def add(self):
  num3=self.num1+self.num2
  num4=self.plusNumber(num3*self.mul)#使用装饰器插入的属性和方法
  return num4
  if __name__=='__main__':
  #整体执行流程:
  #1.打印Operation类名
  #2.修改类的初始化参数
  #3.初始化类
  #4.初始化完成后执行一些方法
  #5.给初始化的实例新增mul属性和plusNumber方法
  #6.实例执行add函数并调用新增的装饰函数和装饰属性
  #7.输出结果
  op=Operation(3,5)
  print(op.add())
  #clsName:Operation
  #do something after the func...
  #42


  二、常用场景


  1.记录日志

  #todo


  2.性能测试

  #todo


  3.循环执行

  #todo


  4.拦截器


  #todo

  5.数据预处理(数据清洗)


 

 #todo


  6.功能植入

  #todo


  综上所述,这篇文章就给大家介绍到这里了,希望可以给大家带来帮助。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/128395.html

相关文章

  • Python知识点:理解和使用装饰器 @decorator

    摘要:使用类装饰器,优点是灵活性大,高内聚,封装性。不过不用担心,有,本身也是一个装饰器,它的作用就是把原函数的元信息拷贝到装饰器函数中,使得装饰器函数也有和原函数一样的元信息。 showImg(https://segmentfault.com/img/bVbrFWb?w=742&h=484);Python的装饰器(decorator)是一个很棒的机制,也是熟练运用Python的必杀技之一。...

    cyqian 评论0 收藏0
  • 简单理解Python装饰

    摘要:下面我们一起抛去无关概念,简单地理解下的装饰器。用函数实现装饰器装饰器要求入参是函数对象,返回值是函数对象,嵌套函数完全能胜任。为了对调用方透明,装饰器返回的对象要伪装成被装饰的函数。 来源:http://www.lightxue.com/under...        Python有大量强大又贴心的特性,如果要列个最受欢迎排行榜,那么装饰器绝对会在其中。       刚接触装饰器,会...

    Meils 评论0 收藏0
  • Python: 会打扮的装饰

    摘要:一般情况下,我们使用装饰器提供的语法糖,来简化上面的写法像上面的情况,可以动态修改函数或类功能的函数就是装饰器。本文标题为会打扮的装饰器本文链接为参考资料修饰器的函数式编程中的装饰器介绍思诚之道装饰器入门与提高赖明星 装饰器 我们知道,在 Python 中,我们可以像使用变量一样使用函数: 函数可以被赋值给其他变量 函数可以被删除 可以在函数里面再定义函数 函数可以作为参数传递给另外...

    blastz 评论0 收藏0
  • 详解Python装饰

    摘要:概括的讲,装饰器的作用就是为已经存在的函数或对象添加额外的功能。在理解这些装饰器之前,最好对函数的闭包和装饰器的接口约定有一定了解。是一个非常简单的装饰器加强包。 Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里。 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数。 def say_hello(): ...

    DandJ 评论0 收藏0
  • 【用故事解读 MobX 源码(四)】装饰器 和 Enhancer

    摘要:所以这是一篇插队的文章,用于去理解中的装饰器和概念。因此,该的作用就是根据入参返回具体的描述符。其次局部来看,装饰器具体应用表达式是,其函数签名和是一模一样。等装饰器语法,是和直接使用是等效等价的。 ================前言=================== 初衷:以系列故事的方式展现 MobX 源码逻辑,尽可能以易懂的方式讲解源码; 本系列文章: 《【用故事解...

    maybe_009 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<