zoukankan      html  css  js  c++  java
  • 装饰器二:无参装饰器和有参装饰器

    装饰器的目的:

      装饰器就是在不修改被装饰对象源代码调用方式的前提下为其添加新功能。

    无参装饰器模板:

     1 #此处的outsider为装饰器,可将其至于被装饰函数顶部,利用@outsider的方式来装饰被装饰函数
     2 def outsider(func):
     3     """
     4     :param func: 被装饰函数名
     5     :return: 返回outsider.wrapper的内层地址
     6     """
     7     def wrapper(*args,**kwargs):
     8         """
     9         :param args:被装饰函数本身所需参数 
    10         :param kwargs:被装饰函数本身所需参数 
    11         :return: 被装饰函数的返回值
    12         """
    13         #此处可增加新的业务逻辑。。。
    14         res = func(*args,**kwargs)
    15         #此处可增加新的业务逻辑。。。
    16         return res
    17     return wrapper

    有参装饰器模板:

     1 def 有参装饰器(x,y):
     2     """
     3     :param x: 有参装饰器参数1
     4     :param y: 有参装饰器参数2
     5     。。。
     6     :return: 返回有参装饰器.outsider的内存地址
     7     """
     8     def outsider(func):
     9         """
    10         :param func: 被装饰函数名
    11         :return: 返回outsider.wrapper的内层地址
    12         """
    13         def wrapper(*args,**kwargs):
    14             """
    15             :param args:被装饰函数本身所需参数
    16             :param kwargs:被装饰函数本身所需参数
    17             :return: 被装饰函数的返回值
    18             """
    19             #此处可增加业务逻辑。。。
    20             res = func(*args,**kwargs)
    21             #此处可增加业务逻辑。。。
    22             return res
    23         return wrapper
    24     return outsider
    25 
    26 
    27 """
    28 有参装饰器调用方式(以@有参装饰器(x=1,y=2)为例):
    29     步骤一:先执行 有参装饰器(x=1,y=2),返回outsider
    30     步骤二:组成@outsider的无参装饰器
    31     步骤三:在执行@outsider的无参装饰器的代码,返回wrapper
    32     步骤四:在执行新增的业务逻辑与被装饰函数,并返回res
    33 """
    34 @有参装饰器(x=1,y=2)
    35 def 被装饰对象():
    36     pass

    有参装饰器warps:注意python提供的有参装饰器wraps需要导入

     1 from functools import wraps
     2 
     3 def outsider(func):
     4     """
     5     :param func: 被装饰函数名
     6     :return: 返回outsider.wrapper的内层地址
     7     """
     8     @wraps(func)    ###将原函数func的所有内置函数均添加到wrapper函数中,目的是将闭包函数wrapper伪装的与原函数func完全一致###
     9     def wrapper(*args,**kwargs):
    10         """
    11         :param args:被装饰函数本身所需参数
    12         :param kwargs:被装饰函数本身所需参数
    13         :return: 被装饰函数的返回值
    14         """
    15         #此处可增加业务逻辑。。。
    16         res = func(*args,**kwargs)
    17         #此处可增加业务逻辑。。。
    18         return res
    19     return wrapper
  • 相关阅读:
    实现一个简易的Spring MVC
    解决IntelIij DEA控制台乱码
    01、SpringBoot中关于tomcat的一些常用配置
    Java动态代理的简单实现
    MVVM中viewmodel的理解
    eclipse常用快捷键
    导入mysql报错问题
    mysql主从配置思路
    rpm安装jdk7
    13个开源GIS软件 你了解几个?
  • 原文地址:https://www.cnblogs.com/xjklmycw/p/15025532.html
Copyright © 2011-2022 走看看