装饰器的多种实现方式

yizhihongxing

一、基于函数实现

  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、在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
  • 浅用描述符

      可以理解为property方法的一种进阶,都可以用来创建一种新形式的实例属性,即在实例属性值的获取和设定上,增加额外的处理事务,such as:类型检查、验证   重写三个属性访问方法,其中__delete__方法是否重写取决需求   在类层次上引用描述符,即该类遵从描述符协议 1 class Check: 2 def __init__(self, na…

    Python开发 2023年4月2日
    00
  • 迭代器执行切片

    普通的切片对迭代器无法实行切片操作 1 from itertools import islice 2 3 4 def func(): 5 for i in [4, 9, 6, 2]: 6 if i % 2 == 0: 7 yield i 8 9 10 f = func() 11 res = islice(f, 3) 12 for i in res: 13 p…

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

    不久之前看过《python工匠》,腾讯大佬朱磊写的,后来一段时间零零散散也会翻开看看,强烈推荐!!! 1、变量注释   变量与注释是最接近自然语言的东西,把变量与注释搞好,同样一段代码,却带来两种截然不同的体验   1.1、变量开辟的必要性   1.2、变量注意靠近使用   1.3、注意变量描述性要强、同时注意其长度   1.4、变量的命名要突出类型   1…

    python 2023年5月4日
    00
  • 面向对象之多态

    鸭子类型   我们都知道面向对象的语言有三大特性:封装、继承和多态,在这里我浅谈一下python的多态 1 class PageOne: 2 def status(self): 3 return “按期申报页” 4 5 6 class PageTwo: 7 def status(self): 8 return “其他申报页” 9 10 11 class Pa…

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

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

    Python开发 2023年4月2日
    00
  • 线程锁在单例模式中的应用

    多个线程在执行过程中会因为竞争同一个资源而产生线程冲突,造成死锁,从而引出线程锁这个概念 先拿到锁再执行业务操作: 当然我对这一块了解的还不透彻,只是了解在不加锁的多线程情况下,会破坏单例模式,所以就有了下面这一段 1 import time 2 import threading 3 4 5 def decorator(func): 6 lock = thr…

    Python开发 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
合作推广
合作推广
分享本页
返回顶部