美文网首页程序员
如何理解Python装饰器

如何理解Python装饰器

作者: 陈码工 | 来源:发表于2018-08-27 16:44 被阅读0次

装饰器本质

装饰器本质上是用一个新的函数替换原先的函数.

@logged
def f(x):
   """does some math"""
   return x + x * x

本质上是如下语句

f = logged(f)

使用wraps保存原函数的namedoc属性

单纯使用之前的装饰器会出现一个问题 -- 用新函数替代老函数后, 我们丢失了老函数的一些属性信息, 比如name, doc_, 这在规范的工程代码中是很不好的.

还好, python为我们提供了一个简单的解决方案, 只要在装饰函数的定义上加上一个@wraps(func)就可以了.

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

@logged
def f(x):
   """does some math"""
   return x + x * x

print f.__name__  # prints 'f'
print f.__doc__   # prints 'does some math'

这个@wraps(func)记号会自动把函数名, docstring, 参数列表等原函数属性都一一复制到最后替换的新函数这里, 让新函数的信息显示正确.

参考资料

https://stackoverflow.com/questions/308999/what-does-functools-wraps-do
https://stackoverflow.com/questions/739654/how-to-make-a-chain-of-function-decorators/1594484#1594484

相关文章

  • Python面试题汇总

    1.如何理解python装饰器?答: 装饰器本质是一个python函数,它可以让其他函数在不需要做任何代码变动的...

  • 如何理解Python装饰器

    装饰器本质 装饰器本质上是用一个新的函数替换原先的函数. 本质上是如下语句 使用wraps保存原函数的name和d...

  • 如何理解Python装饰器

    一、预备知识 首先要理解装饰器,首先要先理解在 Python 中很重要的一个概念就是:“函数是 First Cla...

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

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

  • Python中的Decorator装饰器

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

  • python 装饰器 补充

    重新理解python 装饰器 python 装饰器是一个函数,被装饰器所装饰的代码块最终也是一个函数这个对于一般的...

  • python装饰器

    装饰器简述 要理解装饰器需要知道Python高阶函数和python闭包,Python高阶函数可以接受函数作为参数,...

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

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

  • Python装饰器小谈

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

  • 理解Python装饰器

    Python是很具特色的一门语言。除了面向协议编程的方式,还有许多语法糖,今天要介绍的语法糖————装饰器 我们不...

网友评论

    本文标题:如何理解Python装饰器

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