首页 > 其他分享 >装饰器的多种实现方式

装饰器的多种实现方式

时间:2022-09-21 17:33:38浏览次数:60  
标签:__ 多种 方式 self param func kwargs 装饰 def

一、基于函数实现

  1、嵌套函数

  代码实现:

 1 from functools import wraps
 2 
 3 
 4 def decorator(param):
 5     def wrapper(func):
 6         @wraps(func)
 7         def verify(*args, **kwargs):
 8             if param == 'g':
 9                 print(">>开始执行:{}".format(func.__name__))
10                 func(*args, **kwargs)
11 
12         return verify
13 
14     return wrapper
15 
16 
17 @decorator(param='g')
18 def func():
19     print(">>生活如夏日流水般缓缓前进,我们不要焦急")

  2、三方库decorator

  代码实现

 1 from decorator import decorator
 2 
 3 @decorator
 4 def decorator(func, param=None, *args, **kwargs):
 5     if param == "g":
 6         print(">>开始执行:{}".format(func.__name__))
 7         return func(*args, **kwargs)
 8 
 9 
10 @decorator(param='g')
11 def func():
12     print(">>生活如夏日流水般缓缓前进,我们不要焦急")

二、基于类实现

  1、不带参数

    构造器传入被装饰函数

    代码实现

 1 class Decorator:
 2     def __init__(self, func):
 3         self.func = func
 4 
 5     def __call__(self, *args, **kwargs):
 6         print(">>开始执行:{}".format(self.func.__name__))
 7         return self.func(*args, **kwargs)
 8 
 9 
10 @Decorator
11 def func():
12     print(">>生活如夏日流水般缓缓前进,我们不要焦急")

  2、带参数

    构造器传入参数

    代码实现

 1 class Decorator:
 2     def __init__(self, param):
 3         self.argument = param
 4 
 5     def __call__(self, func):
 6         def wrapper(*args, **kwargs):
 7             if self.argument == 'g':
 8                 print(">>开始执行:{}".format(func.__name__))
 9                 return func(*args, **kwargs)
10         return wrapper
11 
12 
13 @Decorator(param="g")
14 def func():
15     print(">>生活如夏日流水般缓缓前进,我们不要焦急")

标签:__,多种,方式,self,param,func,kwargs,装饰,def
From: https://www.cnblogs.com/shixiaogu/p/16716433.html

相关文章

  • vue中设置class多种方式
    class可以绑定对象数组和函数等<!--第一种:数组直接传递一个数组,注意:这里的class需要使用v-moddel做数据绑定-->33<h1:class="['red','thin']">第一种:数组了......
  • VMware和主机网络连接的三种方式
    VMware和主机网络连接的三种方式桥接模式相当于独立虚拟出一台电脑,和宿主是平行关系。虚拟机一和宿主机使用的是同一块网卡。Host-only虚拟机可以访问虚拟机,可以访问......
  • Spring Boot 两种部署到服务器的方式
    jar包(官方推荐)jar包方式启动,也就是使用springboot内置的tomcat运行。服务器上面只要你配置了jdk1.8及以上,就ok。不需要外置tomcat1.打成jar包2.将jar包放到任意目录......
  • JDK8中String的intern()方法详细解读【内存图解+多种例子+1.1w字长文】
    写在前面,欢迎大家关注小编的微信公众号!!谢谢大家!!一、前言String字符串在我们日常开发中最常用的,当然还有他的两个兄弟StringBuilder和StringBuilder。他三个的区别也是面......
  • 导入ElementUI的方式
    导入方式1、引入ui框架可以引入多个ui框架但是注意css有可能会冲突importElementUIfrom'element-ui';2、引入全局css整个ui框架的风格import'element-ui/lib/the......
  • 设计模式 -- Decorator(装饰模式)
    装饰模式(Decorator)在某些情况下,我们可能会“过度的使用继承来扩展对象的功能”,由于继承为类型引入静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的在......
  • 将驼峰名称转为小写下划线的一种方式
    1Stringvar="userNameAndPassword";2PatternhumpPattern=Pattern.compile("[A-Z]");3Matchermatcher=humpPattern.matcher(var);4StringBuffersb=new......
  • Win11任务管理器打开方式
    https://xinzhi.wenda.so.com/a/1655629920205033方法一找到电脑Windows菜单,并右键单击。2在弹出对话框中点击【任务管理器】。3如图所示任务管理器成功打开。......
  • java流之装饰者模式
    扩展类在于继承FilterInputStream,从而增强read和writer方法的能力输出流同样如此。   推荐文章:https://blog.csdn.net/hustzw07/article/details/80795855......
  • .net通过数据流的方式,HttpWebRequest请求小程序二维码
    #region///<summary>///获取小程序页面的小程序码不限制///</summary>///<paramname="accessTokenOrAppId">AccessToken或App......