iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >对Python装饰器的个人理解方法
  • 883
分享到

对Python装饰器的个人理解方法

方法Python 2023-01-31 07:01:51 883人浏览 八月长安

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

摘要

0.说明                 在自己好好总结并对python装饰器的执行过程进行分解之前,对于装饰器虽然理解它的基本工作方式,但对于存在复杂参数的装饰器(装饰器和函数本身都有参数),总是会感到很模糊,即使这会弄懂了,下一次也很快

0.说明

         

        在自己好好总结并对python装饰器的执行过程进行分解之前,对于装饰器虽然理解它的基本工作方式,但对于存在复杂参数的装饰器(装饰器和函数本身都有参数),总是会感到很模糊,即使这会弄懂了,下一次也很快忘记,其实本质上还是没有多花时间去搞懂其中的细节问题。

        虽然网络上已经有很多这样的文章,但显然都是别人的思想,因此自己总是记不牢,所以花点时间自己好好整理一下。

        最近在对《Python核心编程》做总结,收获了不少,下面分享一下我自己对于Python装饰器的理解,后面还提供了一个较为复杂的Python装饰器的执行过程的分解,可以参考一下。




1.Python装饰器的出现


         在没有装饰器之前,如果要在类中定义一个静态方法,需要使用下面的方法:

class MyClass(object):
    def staticFoo():
        staticFoo = staticmethod(staticFoo)

        即要在该静态方法中加入类似staticmethod()内建函数将该方法转换为静态方法,这显然非常麻烦,而有了装饰器之后,就可以写成下面这样:

class MyClass(object):
    @staticmethod
    def staticFoo():
        pass

        这样就简洁很多了。




2.Python装饰器类型与理解


(1)无参数装饰器    

  • 一个装饰器

        下面的情况:

@f
def foo():
    pass

        其实就相当于:

def foo():
    pass
foo = g(foo)
  • 多个装饰器

        下面的情况:

@g
@f
def foo():
    pass

        就相当于:

def foo():
    pass
foo = g(f(foo))


(2)含参数装饰器

  • 带有参数的一个装饰器

        下面的情况:

@decomaker(deco_args)
def foo():
    pass

        就相当于:

def foo():
    pass
foo = decomaker(deco_args)(foo)

        用这样的思想去理解就非常好理解了:decomaker()用deco_args做了些事并返回函数对象,而该函数对象正是以foo作为其参数的装饰器。

        下面多个装饰器的例子也是按这样的思想去理解。

  • 带有参数的多个装饰器

        下面的情况:

@deco1(deco_arg)
@deco2()
def foo():
    pass

        就相当于:

def foo():
    pass
foo = deco1(deco_arg)(deco2(foo))




3.Python装饰器执行过程的手动分解


        OK,有了上面的理论基础,理解下面一个较为复杂的装饰器就很容易了:

from functools import wraps

def log(text):
    def decorator(func):
        @wraps(func)                    #it works like:wraper.__name__ = func.__name__
        def wrapper(*args, **kwargs):
            print '%s %s():' % (text, func.__name__)
            return func(*args, **kwargs)
        return wrapper
    return decorator


@log('Hello')
def now(area):
    print area, '2016-01-23'
    

now('Beijing')
print 'The name of function now() is:', now.__name__

        执行如下:

/usr/bin/python2.7 /home/xpleaf/PyCharmProjects/decorator_test/dec10.py
Hello now():
Beijing 2016-01-23
The name of function now() is: now

对于该程序的执行过程,可以分析如下:

1.先执行log('Hello')函数,此时返回了一个新的函数,只不过其中的text变量被替换为'Hello',所以用来装饰now函数的新的装饰器如下:

def decorator(func):
    @wraps(func)                    #it works like:wraper.__name__ = func.__name__
    def wrapper(*args, **kwargs):
        print '%s %s():' % ('Hello', func.__name__)
        return func(*args, **kwargs)
    return wrapper

2.所以此时的now函数,就相当于:

now = decorator(now)

3.即now就相当于:

def now(*args, **kwargs):
    print '%s %s():' % ('Hello', old_now.__name__)
    return old_now(*args, **kwargs)
# 现在的函数名称变为了now而不是wrapper,是因为使用了wraps装饰器

   所以,输出的结果也就非常好理解了。

        关于wraps,它也是一个装饰器,使用它的作用是,被我们用自定义装饰器修改后的函数,它的函数名称,即func.__name__跟原来是一样的,而它的工作原理正如上面所提及的,即:

wraper.__name__ = func.__name__

        也就是说,使用wraps可以不改变原来函数的属性,当然,上面只是简单说明了一下其工作原理,详细的可以参考wraps的源代码。

        在GitHub上给出了10个理解装饰器的例子,可以参考一下:https://github.com/xpleaf/decorator


        本文选中我的《Python回顾与整理》系列博文中的《Python回顾与整理9:函数和函数式编程》


--结束END--

本文标题: 对Python装饰器的个人理解方法

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 对Python装饰器的个人理解方法
    0.说明                 在自己好好总结并对Python装饰器的执行过程进行分解之前,对于装饰器虽然理解它的基本工作方式,但对于存在复杂参数的装饰器(装饰器和函数本身都有参数),总是会感到很模糊,即使这会弄懂了,下一次也很快...
    99+
    2023-01-31
    方法 Python
  • python之我对装饰器的理解
      从一开始学习python的时候,就一直不是很理解装饰器是个什么东东,再看了很多篇博文和自己动手敲了好多代码后,算是略有了解。  我理解的装饰器是: 在不改变原有函数调用的情况下,对其进行包装,使其变成另外一种函数来使用,一般的用途是 插...
    99+
    2023-01-31
    我对 python
  • python 装饰器理解
    在理解装饰器之前,先应该对闭包有个概念:所谓闭包,就是将组成函数的语句和这些语句的执行环境打包在一起时得到的对象,它的主要作用是封存上下文。这一特性可以巧妙的被用于现有函数的包装,从而为现有函数添加功能,这就是装饰器。装饰器的本质与作用装饰...
    99+
    2023-01-31
    python
  • 理解Python装饰器(一)
    python装饰器 装饰器是什么?我也不知道该如何给装饰器下定义。 1. 装饰器是函数,因为从代码的层面上来说,它就是开发人员定义的一个函数而已; 2. 装饰器就像是类的继承一样,通过装饰符,来实现函数与函数、函数与类之间的"继承" 3. ...
    99+
    2023-01-31
    Python
  • 如何理解两个很实用的Python装饰器
    本篇文章给大家分享的是有关如何理解两个很实用的Python装饰器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.超时函数这个函数的作用在于可以给任意可能会hang住的函数添加...
    99+
    2023-06-21
  • Python装饰器使用方法全面梳理
    目录1 装饰器背景知识1.1 基本概念1.2 应用场景2 简单的装饰器代码3 使用装饰器记录函数执行次数4 带参数的装饰器5 装饰器处理有返回值的函数1 装饰器背景知识 1.1 基本...
    99+
    2023-01-28
    Python装饰器 Python装饰器使用方法
  • 理解python中装饰器的作用
    装饰器的作用就是用一个新函数封装旧函数(是旧函数代码不变的情况下增加功能)然后会返回一个新函数,新函数就叫做装饰器,一般为了简化装饰器会用语法糖@新函数来简化 例子: 这是一段代码,...
    99+
    2024-04-02
  • python魔术方法之装饰器
    三个魔术方法:__get__()__set__()__delete__()object.__get__(self,实例名,owner)    #owner = 属主 ,instance = 属主类owner的实例object.__set__...
    99+
    2023-01-31
    魔术 方法 python
  • python @property 装饰器使用方法
    目录一、property的装饰器用法二、举例说明1.不用setter和getter方法的实现2.使用setter和getter的实现,增加温度值输入的限制3.利用property装饰...
    99+
    2024-04-02
  • 两个很实用的Python装饰器详解
    目录1.超时函数2.Trace函数总结1.超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 、网络爬虫、数据库查询的时候特别有用...
    99+
    2024-04-02
  • python中property装饰器的使用方法
    这篇文章主要介绍python中property装饰器的使用方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和...
    99+
    2023-06-15
  • Python 装饰器工作原理解析
    #!/usr/bin/env python #coding:utf-8 """ 装饰器实例拆解 """ def login00(func):     print('00请通过验证用户!')     return func def ...
    99+
    2023-01-31
    工作原理 Python
  • Python装饰器的介绍及使用方法
    本篇内容主要讲解“Python装饰器的介绍及使用方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python装饰器的介绍及使用方法”吧!app = Flask(__name...
    99+
    2023-06-17
  • python中装饰器的用法
    这篇文章主要介绍python中装饰器的用法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、装饰器使用场景经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳...
    99+
    2023-06-15
  • python中装饰器的原理
    装饰器这玩意挺有用,当时感觉各种绕,现在终于绕明白了,俺滴个大爷,还是要慢慢思考才能买明白各种的真谛,没事就来绕一绕   def outer(func): def inner(): print("认证成功") ...
    99+
    2023-01-30
    原理 python
  • python文章装饰器理解12步
    1. 函数 在python中,函数通过def关键字、函数名和可选的参数列表定义。通过return关键字返回值。我们举例来说明如何定义和调用一个简单的函数:   def foo(): return 1 foo() 1 方法体(...
    99+
    2023-01-30
    文章 python
  • Python语法详解之decorator装饰器
    python 是一门优雅的语言,有些使用方法就像魔法一样。装饰器(decorator)就是一种化腐朽性为神奇的技巧。最近一直都在使用 Tornado 框架,一直还是念念不忘 Flas...
    99+
    2024-04-02
  • python装饰器底层原理详解
    目录1 python装饰器的作用2 python装饰器的原理3 python装饰器的实现3.1 最简陋的装饰器3.2 给有返回值的函数加上装饰器3.3 给有返回值和参数的函数加上装饰...
    99+
    2024-04-02
  • Python中装饰器的基本功能理解
    目录前言什么是装饰器Python 函数的基本特性函数名的本质:将函数作为变量使用:进一步实现装饰器使用Python装饰器语句:总结前言 在 python 中,装饰器由于是 pytho...
    99+
    2024-04-02
  • Python装饰器的使用方法是什么
    本篇内容主要讲解“Python装饰器的使用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python装饰器的使用方法是什么”吧!1. 什么是装饰器对于受到封装的原函数比如f来说,装饰器...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作