美文网首页嵌牛IT观察
对python中的装饰器的一些理解

对python中的装饰器的一些理解

作者: 小乐杂货铺 | 来源:发表于2017-11-26 20:11 被阅读0次
姓名:乐仁华 学号:16140220023

转载自:

【嵌牛导读】:本文主要是介绍python中装饰器的作用

【嵌牛鼻子】:python , 装饰器

【嵌牛提问】:python的装饰器是什么?有什么用?

【嵌牛正文】:

我想许多刚学python不久的同学见到@这样的符号,都会有些不知所以的感觉,我刚开始遇到时也一脸茫然,后面在网上查了一下说@符号是装饰器的语法糖,那么问题来了,装饰器是啥,语法糖是啥玩意儿,能吃吗。。。。。

image.png
为了搞清楚这个糖到底是可不可以吃的,我们来一个个搞明白。
以下内容参考自知乎的回答
装饰器

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用,概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

先来看一个简单例子:

def foo():
    print('i am foo')

现在有一个新的需求,希望可以记录下函数的执行日志,于是在代码中添加日志代码:

def foo():
    print('i am foo')
    logging.info("foo is running")

bar()、bar2()也有类似的需求,怎么做?再写一个logging在bar函数里?这样就造成大量雷同的代码,为了减少重复写代码,我们可以这样做,重新定义一个函数:专门处理日志 ,日志处理完之后再执行真正的业务代码

def use_logging(func):
    logging.warn("%s is running" % func.__name__)
    func()
    def bar():
    print('i am bar')
    use_logging(bar)

逻辑上不难理解,但是这样的话,我们每次都要将一个函数作为参数传递给use_logging函数。而且这种方式已经破坏了原有的代码逻辑结构,之前执行业务逻辑时,执行运行bar(),但是现在不得不改成use_logging(bar)。那么有没有更好的方式的呢?当然有,答案就是装饰器。

简单装饰器
def use_logging(func):
    def wrapper(*args, **kwargs):
        logging.warn("%s is running" % func.__name__)
        return func(*args, **kwargs)
    return wrapper

def bar():
    print('i am bar')

bar = use_logging(bar)
bar()

函数use_logging就是装饰器,它把执行真正业务方法的func包裹在函数里面,看起来像bar被use_logging装饰了。

@符号是装饰器的语法糖,在定义函数的时候使用,避免再一次赋值操作(@符号看来是为了减少操作的工作。。。。)

def use_logging(func):
    def wrapper(*args, **kwargs):
        logging.warn("%s is running" % func.__name__)
        return func(*args, **kwargs)
    return wrapper
@use_logging
def foo():
    print("i am foo")
@use_logging
def bar():
    print('i am bar')
bar()

这样我们就可以省去bar = use_logging(bar)这一句了,直接调用bar()即可得到想要的结果。如果我们有其他的类似函数,我们可以继续调用装饰器来修饰函数,而不用重复修改函数或者增加新的封装。这样,我们就提高了程序的可重复利用性,并增加了程序的可读性。
所以装饰器是个好东西,要学会用起来。还有很多关于装饰器详细的解释,可以看看这个知乎上的回答:https://www.zhihu.com/question/26930016

相关文章

  • 装饰器模式

    介绍 在python装饰器学习 这篇文章中,介绍了python 中的装饰器,python内置了对装饰器的支持。面向...

  • Python中的Decorator装饰器

    Decorator 装饰器 理解decorator(装饰器)的关键, 在于理解在python中函数是第一公民, 并...

  • 对python中的装饰器的一些理解

    姓名:乐仁华 学号:16140220023 转载自: 【嵌牛导读】:本文主要是介绍python中装饰器的...

  • Python学习资料整理(不间断更新)

    关于Python装饰器的相关文章资料 1、[翻译]理解PYTHON中的装饰器 本篇文章是作者翻译stackover...

  • 2022-10-27

    10个美妙的Python装饰器对Python编程语言中我最喜欢的一些装饰器的概述。 简介 关于Python编程...

  • 对Python装饰器的一些理解

    1.装饰器的定义 装饰器是对在运行期间对函数进行一些外部功能的扩展。也就是在其他函数不需要做任何代码变动的前提下增...

  • Python装饰器小谈

    近几日再次研究Python装饰器,对装饰器又有了新的理解和应用。如果这篇文章叫做小谈装饰器,不如重谈装饰器更来得亲...

  • python的柯里化和装饰器、闭包

    python的高级特性-装饰器有点类似java中的切面编程,要理解python的装饰器首先需要具备两个知识:柯里化...

  • 2019-05-26python装饰器到底是什么?

    装饰器例子 参考语法 装饰器是什么?个人理解,装饰器,是python中一种写法的定义。他仍然符合python的基本...

  • 解析Python中的装饰器

    python中的函数也是对象,函数可以被当作变量传递。 装饰器在python中功能非常强大,装饰器允许对原有函数行...

网友评论

    本文标题:对python中的装饰器的一些理解

    本文链接:https://www.haomeiwen.com/subject/zmxhbxtx.html