简介

装饰器可以在不修改原有代码的基础上添加新的功能,可以将重复重用的代码抽取出来,进一步解耦,方便维护,一般适用于插入日志、性能测试、事务处理、缓存等

装饰器的前提

闭包

一般来说,当一个函数嵌套另一个函数时,内部函数引用到了外部函数的变量,则形成了闭包,如下所示,outter与inner形成了闭包

def outter():
n = 1
def inner():
print(n)
return n
return inner() print(outter())

闭包的作用

1.内部函数可以访问外部函数的变量

2.将外层变量持久化到内存中(一般来说,函数内部的局部变量在这个函数运行完以后,就会被Python的垃圾回收机制从内存中清除掉)

装饰器的实现方式

方法装饰器

直接创建

def outter(func):
def inner(*args, **kwargs):
'''inner'''
print('inner start')
return func(*args, **kwargs)
return inner @outter
def decorator():
'''decorator'''
print('decorator') decorator()
print(decorator.__name__)
print(decorator.__doc__)

由此结果发现,当添加装饰器后会改变原有函数的__name__及__doc__属性,为此我们需要纠正回来

修改函数的名及注释

使用functools下的wraps转译

from functools import wraps

def outter(func):
@wraps(func)
def inner(*args, **kwargs):
'''inner'''
print('inner start')
return func(*args, **kwargs)
return inner @outter
def decorator():
'''decorator'''
print('decorator') decorator()
print(decorator.__name__)
print(decorator.__doc__)

可传参的装饰器

需要在外层再包装一个函数,传入需要传递的参数即可,传入的参数也可以用于内部逻辑代码的处理

from functools import wraps

def decorator(name):
def outter(func):
@wraps(func)
def inner(*args, **kwargs):
'''inner'''
print(f'name:{name}')
print('inner start')
return func(*args, **kwargs)
return inner
return outter @decorator(name='test')
def test():
print('test') test()

类装饰器

直接创建(不带参数)

类装饰器不携带参数,只需构造方法传入方法,重写__call__方法即可

class Decorator():

    def __init__(self, func):
self.func = func def __call__(self, *args, **kwargs):
print('Decorator start')
self.func(*args, **kwargs)
print('Decorator finish') @Decorator
def test():
print('test') test()

携带参数创建

对于携带参数的类装饰器,构造方法需要为参数, 需要重写__call__方法且需要添加内部函数并返回,__call__方法传入方法,内部函数传递被装饰的函数的参数

class Decorator():

    def __init__(self, name):
self.name = name def __call__(self, func):
def inner(*args, **kwargs):
print('inner start')
print(self.name)
func(*args, **kwargs)
print('inner finish')
return inner @Decorator(name='test')
def test():
print('test') test()

python 装饰器理解的更多相关文章

  1. python装饰器理解

    1.装饰器的作用 在不修改被装饰对象的源代码以及调用方式的前提下为被装饰对象添加新功能 原则: 1.不修改被装饰对象的源代码2.不修改被装饰对象的调用方式 目标: 为被装饰对象添加新功能 2.装饰器的 ...

  2. 关于python装饰器(Decorators)最底层理解的一句话

    一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...

  3. 如何理解Python装饰器

    如何理解Python装饰器?很多学员对此都有疑问,那么上海尚学堂python培训这篇文章就给予答复. 一.预备知识 首先要理解装饰器,首先要先理解在 Python 中很重要的一个概念就是:“函数是 F ...

  4. 转发对python装饰器的理解

    [Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考   原文  http://blog.csdn.net/sxw3718401/article/details/3951958 ...

  5. 理解 Python 装饰器看这一篇就够了

    讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它 ...

  6. python 装饰器的理解以及类装饰器

    python装饰器的作用就是在不改变原有函数结构的情况下给该函数增加一个新功能,就是不入侵到原来函数里面修改代码给其增加一个新功能 先看代码 def out(fn): def inner(*args, ...

  7. Python装饰器的通俗理解

    转载:http://blog.csdn.net/u013471155 在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略 ...

  8. (一)Python装饰器的通俗理解

    在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...

  9. 【Python】装饰器理解

    以下文章转载自:点这里 关于装饰器相关的帖子记录在这里: 廖雪峰, thy专栏, stackflow Python的函数是对象 简单的例子: def shout(word="yes" ...

随机推荐

  1. netty系列之:netty中常用的xml编码解码器

    目录 简介 XmlFrameDecoder XmlDecoder 总结 简介 在json之前,xml是最常用的数据传输格式,虽然xml的冗余数据有点多,但是xml的结构简单清晰,至今仍然运用在程序中的 ...

  2. VMWare中CentOS安装VM-Tools

    查看CD-ROM驱动器的设备信息 可以通过下面几个命令来查看 dmesg命令 dmesg | egrep -i --color 'cdrom|dvd|cd/rw|writer' /proc/sys/d ...

  3. 每天一个 HTTP 状态码 202

    202 Accepted 202 Accepted 表示服务器已经接受了这个请求,但是还不确定这个请求是否能够成功地被处理完.该请求最终可能会或可能不会被执行,并且在处理发生时可能会被拒绝,这是不确定 ...

  4. [2-SAT]编码

    题意:给n个01字符串,每个最多包含1个'?',能否构造出满足两两不存在一个是另一个前缀的方案. 思路: 2-SAT+trie树优化建图 把每个字符串拆成i,i+n,如果不存在'?',就硬搞出两种情况 ...

  5. [XJOI3529] 左右

    题目链接:左右 Description 给你一个s数组,一个t数组,你可以对s数组执行以下两种操作 L 操作:每个数等于其左边的数加上自己 R 操作:每个数等于其右边的数加上自己 第一个数的左边是最后 ...

  6. B 树的简单认识

    理解 B 树的概念 B 树是一种自平衡的查找树,能够保持数据有序.这种数据结构能够让查找数据.顺序访问.插入数据及删除数据的动作,都能在对数时间内完成. 同一般的二叉查找树不同,B 树是一棵多路平衡查 ...

  7. npm切换到国内华为云的镜像

    npm下载包很慢?不能忍,切换到国内华为云的镜像吧. npm config set registry https://repo.huaweicloud.com/repository/npm/ npm ...

  8. Windows系统开启显示文件名后缀

    更新记录 2022年4月16日:本文迁移自Panda666原博客,原发布时间:2021年8月26日. 通常Windows系统根据文件名称的后缀来确定文件的类型.经常让朋友出现软件方面的问题,让其修改一 ...

  9. 你难道不知道Vue-cookie?

    install npm install vue-cookies --save main.js import VueCookies from 'vue-cookies'Vue.use(VueCookie ...

  10. PotPlayer播放百度云盘视频

    需要的工具 PotPlayer.油猴tampermonkey.坚果(这个不用下载,有个账号就行) 下载地址:百度网盘 步骤 安装油猴tampermonkey 拖拽Tampermonkey_4.14.c ...