装饰器的多种实现方式

一、基于函数实现

  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(">>生活如夏日流水般缓缓前进,我们不要焦急")

  3、三方库wrapt

  代码实现

 1 import wrapt
 2 
 3 
 4 # 不带参数
 5 @wrapt.decorator
 6 def wrapper(func, instance, args, kwargs):  # 函数签名不可写错
 7     print(">>prepare")
 8     return func(*args, **kwargs)
 9 
10 
11 # 带参数
12 def test(name):
13     @wrapt.decorator
14     def wrapper(func, instance, args, kwargs):
15         if name == "g":
16             print(">>prepare")
17         else:
18             print(">>go...")
19         return func(*args, **kwargs)
20 
21     return wrapper
22 
23 
24 @test(name="c")
25 def func():
26     print(">execute")
27 
28 
29 if __name__ == '__main__':
30     func()

二、基于类实现

  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(">>生活如夏日流水般缓缓前进,我们不要焦急")

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:装饰器的多种实现方式 - Python技术站

(0)
上一篇 2023年4月2日 下午4:56
下一篇 2023年4月2日

相关文章

  • 派生类中扩展属性

    对于在父类中存在的属性,如果要在其派生类中继续扩展属性   可以这样实现 1 class Valley: 2 def __init__(self): 3 self._name = None 4 5 @property 6 def name(self): 7 return self._name 8 9 @name.setter 10 def name(self…

    Python开发 2023年4月2日
    00
  • 猴子补丁

    作用:随时修改代码   (在函数或类定义完成之后,再去修改函数的实现过程) “””类似猴子补丁在函数定义好之后,再去更改他的行为”””import typesclass Valley: def func(self): return “等待宣告”def common(self): return “只有永不遏制的奋斗”if __name__ == ‘__main…

    Python开发 2023年4月2日
    00
  • 编程思想

    三大编程思想:   POP:面向过程编程(Procedure Oriented Programming)   OOP:面向对象编程(Object Oriented Programming)   AOP:面向切面编程(Aspect Oriented Programming) 以下大部分内容引用腾讯云一位笔者,我也是进一步了解纯记录之目的。 POP ​   面向…

    Python开发 2023年4月2日
    00
  • 工匠回忆(二)

    接上文 4、条件分支控制流   避免分支嵌套,异常放在代码片段最前面   4.1、归约函数   4.2、条件表达式的封装避免过长而导致可读性下降   4.3、德摩根定律   4.4、and、or优先级   4.5、or短路效应   4.6、消失的分支     4.6.1、二分查找算法     4.6.2、字典算法   5、异常错误处理   无需多言   6、…

    python 2023年5月4日
    00
  • pyqt入门

      第一次接触pyqt是在20年刚毕业的时候,时隔两年,恰逢闲暇,正好回过头来对这个模块的知识进行一个整理,不会做系统化的整理,我打算可能会围绕之前做过的小工具对其涉及到的控件、信号和槽等知识进行简单的回忆。后面工作如果再涉及或者想到其他的,会再回来更新完善。   pyqt5:同前面整理的kivy一样,同属于GUI开发框架的范畴,不同的是,pyqt用于桌面应…

    2023年4月2日
    00
  • 德摩根定律

    命题逻辑里的一个法则   定义:非p或非q=非(p且q)   最近在看一本书啊《python工匠……》一个腾讯大佬写的,从这里面了解到这个东西,确实不错 1 1 # 德摩根定律 2 2 def func(): 3 3 a = 10 4 4 b = 20 5 5 if not a < 5 or not b < 10: 6 6 print(a…

    Python开发 2023年4月2日
    00
  • 抽象类的子类化机制

    抽象类:可以作为顶层基类,从高层次规范编程接口 1、在abc模块中,最常见的抽象类有Iterable,我们可以用他判断一个对象是不是可迭代对象 1 from collections.abc import Iterable 2 3 4 class Valley: 5 6 def __iter__(self): 7 … 8 9 10 if __name__ …

    Python开发 2023年4月2日
    00
  • __slots__

      在类的层次上定义时,python给实例采用一种更加紧凑的内部表示来管理属性,而非字典,这样,我们只被允许访问__slots__内部的属性   这样定义会带来两点好处,然后具体的实践我在工作中目前运用的还很少,后面如果发现还有什么坑,我再来补充 1、创建大量实例时节省内存 2、访问属性快 1 class Valley: 2 __slots__ = “nam…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部