装饰器的多种实现方式

一、基于函数实现

  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日

相关文章

  • 编程思想

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

    Python开发 2023年4月2日
    00
  • 状态机的实现

    代码里我们经常会出现大量的条件判断,在这种情况下,我们可以实现状态机避免过度使用 有一种方式是把各种状态归为各种状态类 还有一种方式是修改实例的__class__属性 1 “”” 2 状态机的实现 3 修改实例的__class__属性 4 “”” 5 6 7 class Connection: 8 def __init__(self): 9 self.new…

    Python开发 2023年4月2日
    00
  • 代码坏味道(一)

    1、神秘命名   模块、类、函数、变量等的命名是编程中最难的两件事之一,正因为如此,改名可能是最常用的重构手法   对应的重构手法有:改变函数声明、变量改名、字段改名 2、重复代码   顾名思义,就是在多处看到相同的代码结构   对应的重构手法有:移动语句、提炼函数 3、过长的函数   确保函数内代码处在同一层抽象级,无须担心进程内的函数开销,提倡小函数 4…

    Python开发 2023年3月31日
    00
  • 方法的多种调用方式

      方法调用确实我们每个人都会,但是我觉得大家可能用的最多的就是那种常规的方式,这里呢,我要记录一下另外几种方式 1 from operator import attrgetter 2 from operator import methodcaller 3 4 5 class Valley: 6 def func(self): 7 print(“测试方法”)…

    Python开发 2023年4月2日
    00
  • 派生类中扩展属性

    对于在父类中存在的属性,如果要在其派生类中继续扩展属性   可以这样实现 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
  • 多组合少继承

    继承:   强调类与类之间的关系 组合:   强调对象和对象之间的关系 清楚python支持多继承,从而涉及到一些MRO的点,这里不做赘述,在实际工作过程中,我们经常会使用继承来实现代码复用,如果仅仅是为了复用,还是比较推荐使用组合方式,因为继承方式,使得类与类之间的耦合性变得异常紧密,这多少违背了迪米特法则 1 “”” 2 OOP中三大特性之一:继承 3 …

    Python开发 2023年4月2日
    00
  • 生成器的反向验证

    生成器是一种特殊的迭代器,也可以说其父类型是迭代器   1、迭代器其实也有很多点要清楚,这里先不做赘述   2、要清楚,迭代器调用iter()返回的是自身 1 def func(s, e): 2 “”” 3 生成器函数 4 :param s:起始值 5 :param e: 末值 6 :return: 7 “”” 8 num = s 9 while num &…

    Python开发 2023年4月2日
    00
  • 循环优化一

    主角:takewhile   判断序列中元素是否为偶数,奇数则终止 这是我们最常用的一种方式,其实没必要这么复杂 1 a = [4, 6, 7, 3] 2 3 4 def judge_is_even(item): 5 if item % 2 == 0: 6 return True 7 return False 8 9 10 # 最常用 11 for item…

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