资讯专栏INFORMATION COLUMN

Python装饰器

aisuhua / 1362人阅读

摘要:一引用书流畅的书二基本概念问题装饰器是什么解答严格来说,装饰器只是语法糖,装饰器是可调用的对象,可以像常规的可调用对象那样调用,特殊的地方是装饰器的参数是一个函数问题装饰器有什么特性解答装饰器有个特性,一是可以把被装饰的函数替换成其他函数,

一, 引用

[书] 流畅的Python

[书] Effective Python


二, 基本概念

问题1:装饰器是什么?

解答: 严格来说,装饰器只是语法糖, 装饰器是可调用的对象,可以像常规的可调用对象那样调用,特殊的地方是装饰器的参数是一个函数

问题2:装饰器有什么特性?

解答: 装饰器有2个特性,一是可以把被装饰的函数替换成其他函数, 二是可以在加载模块时候立即执行

def decorate(func):
    print("running decorate", func)
    def decorate_inner():
        print("running decorate_inner function")
        return func()
    return decorate_inner

@decorate
def func_1():
    print("running func_1")

if __name__ == "__main__":

    print(func_1)

#返回值
running decorate 
.decorate_inner at 0x7f29f641cb70>

问题3:如何使用被装饰函数中的参数?

解答: 通过args 和 *kwargs 传递被修饰函数中的参数

def decorate(func):
    def decorate_inner(*args, **kwargs):
        print(type(args), type(kwargs))
        print("args", args, "kwargs", kwargs)
        return func(*args, **kwargs)
    return decorate_inner

@decorate
def func_1(*args, **kwargs):
    print(args, kwargs)

if __name__ == "__main__":

    func_1("1", "2", "3", para_1="1", para_2="2", para_3="3")

#返回值
 
args ("1", "2", "3") kwargs {"para_2": "2", "para_1": "1", "para_3": "3"}
("1", "2", "3") {"para_2": "2", "para_1": "1", "para_3": "3"}

三, 叠放装饰器

问题1:叠放装饰器执行顺序是什么?

解答: 如果一个函数被多个装饰器修饰,其实应该是该函数先被最里面的装饰器修饰后(下面例子中函数main()先被inner装饰,变成新的函数),变成另一个函数后,再次被装饰器修饰

def outer(func):
    print("enter outer", func)
    def wrapper():
        print("running outer")
        func()
    return wrapper

def inner(func):
    print("enter inner", func)
    def wrapper():
        print("running inner")
        func()
    return wrapper

@outer
@inner
def main():
    print("running main")

if __name__ == "__main__":

    main()

#返回值

enter inner 
enter outer .wrapper at 0x7fa1c96e8bf8>
running outer
running inner
running main

四, 标准库中的装饰器

问题1: 标准库中都有哪些装饰器?

解答: 标准库中有多种装饰器, 例如:装饰方法的函数有property, classmethod, staticmethod; functools模块中的lru_cache, singledispatch,  wraps 等等

from functools import lru_cache
from functools import singledispatch
from functools import wraps

问题2:为什么要使用@wraps装饰器?它的作用是什么?

解答: 使用装饰器会产生我们可能不希望出现的副作用, 例如:改变被修饰函数名称,对于调试器或者对象序列化器等需要使用内省机制的那些工具,可能会无法正常运行;其实调用装饰器后,会将同一个作用域中原来函数同名的那个变量(例如下面的func_1),重新赋值为装饰器返回的对象;使用@wraps后,会把与内部函数(被修饰函数,例如下面的func_1)相关的重要元数据全部复制到外围函数(例如下面的decorate_inner)

from functools import wraps

def decorate(func):
    print("running decorate", func)
    @wraps(func)
    def decorate_inner():
        print("running decorate_inner function", decorate_inner)
        return func()
    return decorate_inner

@decorate
def func_1():
    print("running func_1", func_1)

if __name__ == "__main__":

    func_1()

#返回值
running decorate 
running decorate_inner function 
running func_1 

五, 装饰器设计模式

问题1: 什么是装饰器设计模式?

解答: 动态的给一个对象添加一些额外的职责,就扩展功能而言,装饰器模式比子类化更加灵活,在设计模式中,装饰器和组件都是抽象类,为了给具体的组件添加行为,具体的装饰器实例要包装具体组件的实例,即,装饰器和所装饰的组件接口一致,对使用该组建的客户透明,将客户的请求转发给该组件,并且可能在转发前后执行一些额外的操作,透明性使得可以递归嵌套多个装饰器,从而可以添加任意多个功能

问题2: Python中的装饰器函数和设计模式中的装饰器模式有什么关系?

解答:  修饰器模式和Python修饰器之间并不是一对一的等价关系, Python装饰器函数更为强大,不仅仅可以实现装饰器模式。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40774.html

相关文章

  • Python】一文弄懂python装饰(附源码例子)

    摘要:装饰器的使用符合了面向对象编程的开放封闭原则。三简单的装饰器基于上面的函数执行时间的需求,我们就手写一个简单的装饰器进行实现。函数体就是要实现装饰器的内容。类装饰器的实现是调用了类里面的函数。类装饰器的写法比我们装饰器函数的写法更加简单。 目录 前言 一、什么是装饰器 二、为什么要用装饰器 ...

    liuchengxu 评论0 收藏0
  • Python装饰vs装饰模式

    摘要:希望引以为戒郑传装饰模式如果你了解,你肯定听过装饰器模式。在面向对象中,装饰模式指动态地给一个对象添加一些额外的职责。就增加一些功能来说,装饰模式比生成子类更为灵活。 漫谈 如果作为一个Python入门,不了解Python装饰器也没什么,但是如果作为一个中级Python开发人员,如果再不对python装饰器熟稔于心的话,那么可能并没有量变积累到质变。 我以前也看过很多讲python 装...

    stackvoid 评论0 收藏0
  • Python: 会打扮的装饰

    摘要:一般情况下,我们使用装饰器提供的语法糖,来简化上面的写法像上面的情况,可以动态修改函数或类功能的函数就是装饰器。本文标题为会打扮的装饰器本文链接为参考资料修饰器的函数式编程中的装饰器介绍思诚之道装饰器入门与提高赖明星 装饰器 我们知道,在 Python 中,我们可以像使用变量一样使用函数: 函数可以被赋值给其他变量 函数可以被删除 可以在函数里面再定义函数 函数可以作为参数传递给另外...

    blastz 评论0 收藏0
  • Python学习之路26-函数装饰和闭包

    摘要:初步认识装饰器函数装饰器用于在源代码中标记函数,以某种方式增强函数的行为。函数装饰器在导入模块时立即执行,而被装饰的函数只在明确调用时运行。只有涉及嵌套函数时才有闭包问题。如果想保留函数原本的属性,可以使用标准库中的装饰器。 《流畅的Python》笔记本篇将从最简单的装饰器开始,逐渐深入到闭包的概念,然后实现参数化装饰器,最后介绍标准库中常用的装饰器。 1. 初步认识装饰器 函数装饰...

    sunny5541 评论0 收藏0
  • Python中的函数装饰和闭包

    摘要:变量查找规则在中一个变量的查找顺序是局部环境,闭包,全局,内建闭包引用了自由变量的函数。闭包的作用闭包的最大特点是可以将父函数的变量与内部函数绑定,并返回绑定变量后的函数,此时即便生成闭包的环境父函数已经释放,闭包仍然存在。 导语:本文章记录了本人在学习Python基础之函数篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、掌握装饰器的本质、功...

    caozhijian 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<