当前位置: 首页 > 编程笔记 >

Python装饰器实现方法及应用场景详解

池庆
2023-03-14
本文向大家介绍Python装饰器实现方法及应用场景详解,包括了Python装饰器实现方法及应用场景详解的使用技巧和注意事项,需要的朋友参考一下

应用场景:

1、授权(Authorization)

装饰器能有助于检查某个人是否被授权去使用一个web应用的端点(endpoint)。它们被大量使用于Flask和Django web框架中。这里是一个例子来使用基于装饰器的授权:

from functools import wraps  # 最新版python引用是 import functools

def requires_auth(f):  # f 就是我们需要装饰的函数,一看就是不带参数的装饰器
  @wraps(f)   # 新版python写法 @functools.wraps(f)
  def decorated(*args, **kwargs):
    auth = request.authorization
    if not auth or not check_auth(auth.username, auth.password):
      authenticate()
    return f(*args, **kwargs)
  return decorated  # 该装饰器需相关html" target="_blank">配置才能运行,这里是截取代码展示应用

2.、日志(Logging)

日志是装饰器运用的另一个亮点。这是个例子:

from functools import wraps
def logit(func):
  @wraps(func)
  def with_logging(*args, **kwargs):
    print(func.__name__ + " was called")
    return func(*args, **kwargs)
  return with_logging

@logit
def addition_func(x):
  """Do some math."""
  return x + x
result = addition_func(4)

我敢肯定你已经在思考装饰器的一个其他聪明用法了。

3.、带参数的装饰器

带参数的装饰器是典型的闭包函数

4.、在函数中嵌入装饰器

我们回到日志的例子,并创建一个包裹函数,能让我们指定一个用于输出的日志文件

from functools import wraps

def logit(logfile='out.log'):
  def logging_decorator(func):
    @wraps(func)
    def wrapped_function(*args, **kwargs):
      log_string = func.__name__ + " was called"
      print(log_string)
      # 打开logfile,并写入内容
      with open(logfile, 'a') as opened_file:
        # 现在将日志打到指定的logfile
        opened_file.write(log_string + '\n')
      return func(*args, **kwargs)
    return wrapped_function
  return logging_decorator
@logit()
def myfunc1():
  pass
myfunc1()
# Output: myfunc1 was called
# 现在一个叫做 out.log 的文件出现了,里面的内容就是上面的字符串
@logit(logfile='func2.log')
def myfunc2():
  pass
myfunc2()
# Output: myfunc2 was called
# 现在一个叫做 func2.log 的文件出现了,里面的内容就是上面的字符串

5.、装饰器类

现在我们有了能用于正式环境的logit装饰器,但当我们的应用的某些部分还比较脆弱时,异常也许是需要更紧急关注的事情。比方说有时你只想打日志到一个文件。而有时你想把引起你注意的问题发送到一个email,同时也保留日志,留个记录。这是一个使用继承的场景,但目前为止我们只看到过用来构建装饰器的函数。

幸运的是,类也可以用来构建装饰器。那我们现在以一个类而不是一个函数的方式,来重新构建logit。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍Python类装饰器实现方法详解,包括了Python类装饰器实现方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python类装饰器。分享给大家供大家参考,具体如下: 编写类装饰器 类装饰器类似于函数装饰器的概念,但它应用于类,它们可以用于管理类自身,或者用来拦截实例创建调用以管理实例。 单体类 由于类装饰器可以拦截实例创建调用,所以它们可以用来管理一个类的所有实例,

  • 本文向大家介绍饰器器的写法以及应用场景。相关面试题,主要包含被问及饰器器的写法以及应用场景。时的应答技巧和注意事项,需要的朋友参考一下 含义:装饰器本质就是函数,为其他函数添加附加功能 原则: 不修改被修饰函数的代码 不修改被修饰函数的调用方式 应用场景: 无参装饰器在用户登录 认证中常见 有参装饰器在flask的路由系统中见到过        

  • 本文向大家介绍谈谈Python的深浅拷贝?以及实现方法和应用场景。相关面试题,主要包含被问及谈谈Python的深浅拷贝?以及实现方法和应用场景。时的应答技巧和注意事项,需要的朋友参考一下 浅拷贝只是增加了一个指针指向一个存在的地址, 而深拷贝是增加一个指针并且开辟了新的内存,这个增加的指针指向这个新的内存, 采用浅拷贝的情况,释放内存,会释放同一内存,深拷贝就不会出现释放同一内存的错误 一层的情况

  • 本文向大家介绍Python闭包和装饰器用法实例详解,包括了Python闭包和装饰器用法实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python闭包和装饰器用法。分享给大家供大家参考,具体如下: Python的装饰器的英文名叫Decorator,作用是完成对一些模块的修饰。所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装

  • 本文向大家介绍Python函数装饰器常见使用方法实例详解,包括了Python函数装饰器常见使用方法实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python函数装饰器常见使用方法。分享给大家供大家参考,具体如下: 一、装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所以我们应该遵循开放封闭的原则。 也就是说:我们必须找

  • 本文向大家介绍python装饰器实例大详解,包括了python装饰器实例大详解的使用技巧和注意事项,需要的朋友参考一下 一.作用域 在python中,作用域分为两种:全局作用域和局部作用域。  全局作用域是定义在文件级别的变量,函数名。而局部作用域,则是定义函数内部。  关于作用域,我们要理解两点:     a.在全局不能访问到局部定义的变量     b.在局部能够访问到全局定义的变量,但是不能修