返回顶部
首页 > 资讯 > 后端开发 > Python >Python代码中的装饰器很重要吗
  • 665
分享到

Python代码中的装饰器很重要吗

2023-06-15 18:06:17 665人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

本篇内容介绍了“python代码中的装饰器很重要吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 01什么是装饰器?要理解什么是装

本篇内容介绍了“python代码中的装饰器很重要吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

 01什么是装饰器?

要理解什么是装饰器,您首先需要熟悉Python处理函数的方式。从它的观点来看,函数和对象没有什么不同。它们有属性,可以重新分配:

def func():    print('hello from func')  func()  > hello from func  new_func = func  new_func()  > hello from func  print(new_func.__name__)  > func

此外,你还可以将它们作为参数传递给其他函数:

def func():    print('hello from func')  def call_func_twice(callback):    callback()    callback()  call_func_twice(func)  > hello from func  > hello from func

现在,我们介绍装饰器。装饰器(decorator)用于修改函数或类的行为。实现这一点的方法是定义一个返回另一个函数的函数(装饰器)。这听起来很复杂,但是通过这个例子你会理解所有的东西:

def logging_decorator(func):   def logging_wrapper(*args, **kwargs):     print(f'Before {func.__name__}')     func(*args, **kwargs)     print(f'After {func.__name__}')   return logging_wrapper      @logging_decorator def sum(x, y):   print(x + y)    sum(2, 5) > Before sum > 7 > After sum

让我们一步一步来:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 首先,我们在第1行定义logging_decorator函数。它只接受一个参数,也就是我们要修饰的函数。

  3. 在内部,我们定义了另一个函数:logging_wrapper。然后返回logging_wrapper,并使用它来代替原来的修饰函数。

  4. 在第7行,您可以看到如何将装饰器应用到sum函数。

  5. 在第11行,当我们调用sum时,它不仅仅调用sum。它将调用logging_wrapper,它将在调用sum之前和之后记录日志

02为什么需要装饰器

这很简单:可读性。Python因其清晰简洁的语法而备受赞誉,装饰器也不例外。如果有任何行为是多个函数共有的,那么您可能需要制作一个装饰器。下面是一些可能会派上用场的例子:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 在运行时检查实参类型

  3. 基准函数调用

  4. 缓存功能的结果

  5. 计数函数调用

  6. 检查元数据(权限、角色等)

  7. 编程

和更多…

现在我们将列出一些代码示例。

03例子

带有返回值的装饰器

假设我们想知道每个函数调用需要多长时间。而且,函数大多数时候都会返回一些东西,所以装饰器也必须处理它:

def timer_decorator(func):   def timer_wrapper(*args, **kwargs):     import datetime                      before = datetime.datetime.now()                          result = func(*args,**kwargs)                     after = datetime.datetime.now()                           print "Elapsed Time = {0}".fORMat(after-before)           return result      @timer_decorator def sum(x, y):   print(x + y)   return x + y    sum(2, 5) > 7 > Elapsed Time = some time

可以看到,我们将返回值存储在第5行的result中。但在返回之前,我们必须完成对函数的计时。这是一个没有装饰者就不可能实现的行为例子。

带有参数的装饰器

有时候,我们想要一个接受值的装饰器(比如flask中的@app.route('/login'):

def permission_decorator(permission):   def _permission_decorator(func):     def permission_wrapper(*args, **kwargs):       if someUserapi.hasPermission(permission):         result = func(*args, **kwargs)         return result       return None     return permission wrapper   return _permission_decorator  @permission_decorator('admin') def delete_user(user):   someUserApi.deleteUser(user)

为了实现这一点,我们定义了一个额外的函数,它接受一个参数并返回一个装饰器。

带有类的装饰器

使用类代替函数来修饰是可能的。唯一的区别是语法,所以请使用您更熟悉的语法。下面是使用类重写的日志装饰器:

class Logging:         def __init__(self, function):          self.function = function         def __call__(self, *args, **kwargs):       print(f'Before {self.function.__name__}')       self.function(*args, **kwargs)       print(f'After {self.function.__name__}')       @Logging def sum(x, y):   print(x + y)  sum(5, 2) > Before sum > 7 > After sum

这样做的好处是,您不必处理嵌套函数。你所需要做的就是定义一个类并覆盖__call__方法。

装饰类

有时,您可能想要修饰类中的每个方法。你可以这样写

class MyClass:    @decorator    def func1(self):      pass    @decorator    def func2(self):      pass

但如果你有很多方法,这可能会失控。值得庆幸的是,有一种方法可以一次性装饰整个班级:

def logging_decorator(func):   def logging_wrapper(*args, **kwargs):     print(f'Before {func.__name__}')     result = func(*args, **kwargs)     print(f'After {func.__name__}')     return result   return logging_wrapper  def log_all_class_methods(cls):     class NewCls(object):       def __init__(self, *args, **kwargs):         self.original = cls(*args, **kwargs)              def __getattribute__(self, s):         try:               x = super(NewCls,self).__getattribute__(s)         except AttributeError:                 pass         else:           return x         x = self.original.__getattribute__(s)         if type(x) == type(self.__init__):            return logging_decorator(x)                          else:           return x     return NewCls      @log_all_class_methods class SomeMethods:   def func1(self):     print('func1')        def func2(self):     print('func2')      methods = SomeMethods() methods.func1() > Before func1 > func1 > After func1

现在,不要惊慌。这看起来很复杂,但逻辑是一样的:

  • 首先,我们让logging_decorator保持原样。它将应用于类的所有方法。

  • 然后我们定义一个新的装饰器:log_all_class_methods。它类似于普通的装饰器,但却返回一个类。

  • NewCls有一个自定义的__getattribute__。对于对原始类的所有调用,它将使用logging_decorator装饰函数。

内置的修饰符

您不仅可以定义自己的decorator,而且在标准库中也提供了一些decorator。我将列出与我一起工作最多的三个人:

@property -一个内置插件的装饰器,它允许你为类属性定义getter和setter。

@lru_cache - functools模块的装饰器。它记忆函数参数和返回值,这对于纯函数(如阶乘)很方便。

@abstractmethod——abc模块的装饰器。指示该方法是抽象的,且缺少实现细节。

“Python代码中的装饰器很重要吗”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Python代码中的装饰器很重要吗

本文链接: https://lsjlt.com/news/281084.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python代码中的装饰器很重要吗
    本篇内容介绍了“Python代码中的装饰器很重要吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 01什么是装饰器要理解什么是装饰...
    99+
    2023-06-15
  • python装饰器代码解析
    目录1.装饰器通用模型2.多个装饰器装饰的函数执行3.带参数的装饰器4.类装饰器1.装饰器通用模型 def wrapper(fn):     def inner(*args, **k...
    99+
    2024-04-02
  • Python装饰器代码详解
    目录一、理解装饰器二、装饰器原型1、不带参数的装饰器2.带参数的被装饰的函数3.带参数的装饰器4.使用类作为装饰器5.使用对象作为装饰器6.多层装饰器的嵌套总结一、理解装饰器 所有东...
    99+
    2024-04-02
  • Python 装饰器代码解析
    前言: 以往看到我博客的小伙伴可能都知道,我的前言一般都是吐槽和讲废话环节,哈哈哈哈。今天难得休息,最近可真是太忙了,博主已经连续一年都在996了,所以最近没怎么学习新东西,只能回顾...
    99+
    2024-04-02
  • Python中装饰器代码是怎么样的
    这篇文章主要为大家展示了“Python中装饰器代码是怎么样的”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python中装饰器代码是怎么样的”这篇文章吧。一、理解装饰器所有东西都是对象(函数可以...
    99+
    2023-06-25
  • python装饰器代码的示例分析
    这篇文章主要介绍python装饰器代码的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.装饰器通用模型def wrapper(fn):    def&nbs...
    99+
    2023-06-29
  • 为什么代码重构在软件开发中很重要
    这篇文章主要讲解了“为什么代码重构在软件开发中很重要”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么代码重构在软件开发中很重要”吧! 什么是代...
    99+
    2024-04-02
  • 两个很实用的Python装饰器详解
    目录1.超时函数2.Trace函数总结1.超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 、网络爬虫、数据库查询的时候特别有用...
    99+
    2024-04-02
  • 一起来看看python的装饰器代码
    装饰器通用模型 def wrapper(fn): def inner(*args, **kwargs): ret = fn(*args, **kwargs) ...
    99+
    2024-04-02
  • Python装饰器怎么用代码实现
    这篇“Python装饰器怎么用代码实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python装饰器怎么用代码实现”文章吧...
    99+
    2023-06-17
  • python的迭代器,生成器和装饰器你了解吗
    python 迭代器与生成器,装饰器 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。 迭代器有两个基本的方法:iter() 和 next()。 字符串,列表或元组...
    99+
    2024-04-02
  • 如何理解两个很实用的Python装饰器
    本篇文章给大家分享的是有关如何理解两个很实用的Python装饰器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.超时函数这个函数的作用在于可以给任意可能会hang住的函数添加...
    99+
    2023-06-21
  • python 装饰器的使用与要点
    目录一、装饰器使用场景二、为什么需要装饰器1、先来看一个简单例子:2、增加需求3、又有需求三、基础装饰器入门1、装饰器语法糖2、对带参数的函数进行装饰3、函数参数数量不确定4、装饰器带参数5、functools.wr...
    99+
    2022-06-02
    python 装饰器使用 python 装饰器要点
  • Python代码风格与编程习惯重要吗?
    Python代码风格 首先我们要以 PEP8 代码规范为标准,但也无需完全遵守。例如:一行不能超过 79 个字符等。 Python模块模板 模块开头指定编码格式 模块文档注释,展示模...
    99+
    2024-04-02
  • python中的装饰器decorator
    装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x): return x def f2(x): return...
    99+
    2023-01-31
    python decorator
  • python装饰器中的@wraps
    python装饰器中的@wraps 第一段代码:没有添加@wraps def user_login_confirm(name): print('我是', name) def deco_fun(view_func): ...
    99+
    2023-01-31
    器中 python wraps
  • python中的生成器、迭代器、装饰器详解
    一、装饰器 由于一个函数能实现一种功能,现在想要在不改变其代码的情况下,让这个函数进化一下,即能保持原来的功能,还能有新的"技能",怎么办? 现已经存在一个自定义...
    99+
    2024-04-02
  • python中的迭代器,生成器与装饰器详解
    目录迭代器生成器装饰器总结迭代器 每一个可迭代类内部都要实现__iter__()方法,返回一个迭代类对象,迭代类对象则定义了这个可迭代类如何迭代。 for循环调用list本质上是是调...
    99+
    2024-04-02
  • python中装饰器的用法
    这篇文章主要介绍python中装饰器的用法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、装饰器使用场景经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳...
    99+
    2023-06-15
  • python中装饰器的原理
    装饰器这玩意挺有用,当时感觉各种绕,现在终于绕明白了,俺滴个大爷,还是要慢慢思考才能买明白各种的真谛,没事就来绕一绕   def outer(func): def inner(): print("认证成功") ...
    99+
    2023-01-30
    原理 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作